函数递归问题!!!头大!!!!!

来源:百度知道 编辑:UC知道 时间:2024/05/29 07:17:59
1.老是把递归问题搞不清楚.什么时候该用,什么时候不该用.
而且每当遇到一个递归的例子,我就老想搞清楚它每一步怎么运行的,但是越搞越糊涂....

2.特别是象那种汉诺塔的问题.
mian()
{
........./*输入一个数n,n表示有多少个盘子*/
movetower(n,'A','B','C');/*把n盘子从A塔移到C塔*/
}

void movetower(n,a,b,c)
int n;
char a,b,c;
{
void movedisk();
if(n>0)
{
movetower(n-1,a,c,b);
movedisk(a,c);
movetower(n-1,b,a,c);
}
void movedisk(from,to)
char from,to
{
printf("%c->%c\n",from,to);
}
-----根本搞不清楚movetower函数的递归过程.虽然也说了,不要求知道递归过程如何.但是这个递归的算法是如何确定的?

特别想问的是,当一个函数里面调用自身两次或两次以上的时候,过程是怎样的?

调用函数之前将当前的数据压栈,每一层调用完毕返回的时候返回到前一次调用的时候。
汉诺塔问题可以分解为三大步:
1、将n-1个盘子借助c从a移到b
2、将最大的第n个盘子从a移到c(一步完成)
3、将b上的n-1个盘子借助a移到c(这时c可以当空柱子用,因为c上的盘子比n-1个盘子都大)
可以从2个盘子开始想。将n-1即1个盘子放到b,将第n也就是第2个盘子放到c,再将b上的n-1个盘子放到c(需要的话借助a)
增加一个盘子,3个。分为三步:将前两个移到b(上个例子),将第3个放到c;再将b上的两个移到c
n数值增加的时候类推下去
关于这个问题,谭浩强的c语言书上讲递归的时候讲的很明白,多看看数据是怎么入栈出栈的就明白了

递归能解决普通循环结构不能解决的问题,比如汉诺塔问题.
它与循环的一个明显区别是:循环不用保存现场,但递归需要保存现场,待调用完自身后返回.
一般能用循环解决的问题就不要递归,因为递归消耗的空间大.
在理解递归算法时,不要试图把每次递归调用都搞清楚,你就把递归函数看成一个有入口和出口的盒子,进去的是参数,出来的是结果.

从简单的例子来分析,你列的这个例子有点复杂了
int counter=0;
f(int value)
{
if(counter<2)
{
value=value*value;
counter++;
f(value);
}
}
计算传入value值的平方,counter用于计数,if通过counter的值判断退出条件,if判断里面的f(value)用于出现递归效果
总结一下,一个递归方法要有三个条件:
1.在方法体中包含自身f(value);
2.有退出递归的条件判断if();
3.构造递归想要解决的问题value=value*value;

跟踪一下就行..
或者用换位思想

楼上正解

我认为,楼主不妨自己用递归和非递归分别编一下求某数的n次幂的函数
这样会