关于递归问题
递归到底是怎么样实现的???很苦恼。。。求解。。。。。。 就是自己调用自己,中学数学也讲过啊。f(x)=f(x)+1.上一次的结果累积到新的一次。你这样想,别把F(X)想成函数,就想成一个数字,然后你先推,最后在转换成函数。应该就好理解了。 说白了就是调用函数,只不过这函数是自己而言。 正在写代码 发表于 2013-12-3 11:07 static/image/common/back.gif就是自己调用自己,中学数学也讲过啊。f(x)=f(x)+1.上一次的结果累积到新的一次。你这样想,别把F(X)想成函 ...
那个汉诺塔一直不理解,也知道它是自己调用自己 小亮1201 发表于 2013-12-3 13:56 static/image/common/back.gif
说白了就是调用函数,只不过这函数是自己而言。
那个汉诺塔一直不理解,也知道它是自己调用自己 这对于学汇编的童鞋来说,压根不是事{:5_109:} 18326638710 发表于 2013-12-3 16:44 static/image/common/back.gif
那个汉诺塔一直不理解,也知道它是自己调用自己
慢慢就理解了,你现在只是知道自己调用自己 但是不理解自己调用自己 其实和循环有点类似。循环是不断调用一段代码。递归是把这段代码写到一个函数里去,然后函数自己调用自己(也是不断调用函数体内的这段代码,当然返回值的处理有点不一样,如果学过数据结构的堆栈就能理解了) 说实话,我也不理解 表示我也不理解 通用公式, 就是递归。通过反复调用同样的函数,来实现。 递归函数是最后一行的情况称为伪递归。这东西有点只能意会不能言传的感觉!我递归也不是很熟练! 给我汉娜塔源程序 我帮你分析一下 递归就是函数自己调用自己 你可以把每次调用当做一个函数在调用另一个函数来理解 本帖最后由 紫月冰蓝 于 2014-4-9 17:33 编辑
假设求n!:
假设n=4
fac(int n)
{
int t;
if(n==1||n==0) return 1; // 这里是1号
else
{
t=n*fac(n-1); //这里是2号
return t;//这里是3号
}
}
这里当主函数第一次调用fac时,系统为形参n开辟了存储单元, 为了区分,这个单元假设叫n1,把4的值传给n1,
同时系统为变量t开辟单元,假设叫t1;因为n1的值大于1,程序执行第2号语句中的赋值语句,按运算规律,应该先求等号右边的表达式的值;在此表达式中用实参n-1(值为3)又一次调用了fac函数自己,
进入第二次调用fac,系统为形参n开辟了一个新的单元n2,把3的值传给n2,同时系统为变量t开辟了新的单元t2,程序再次执行第2号语句,又一次调用了fac函数自己,这时实参n-1值为2.
进行第三次调用fac,与第二次相同,只是形参n3的值为2,程序再次执行第2号语句,又一次调用自己,实参n-1的值为1
进行第四次调用fac,与第二次机同,只是形参n4的值为1,这时执行第1号语句中if语句后面的return,递归调用结束,同时结束本次调用,返回函数值1,本次调用中形参n4与变量t4所占的单元被释放,
程序返回到第三次调用中第2号语句的调用点,表达式n*fac(n-1)中,fac函数的返回值是1,n3中的值是2,因此表达式的值为2,赋给t3;接着执行第3号语句中的return语句,本次调用结束,返回函数值2,同时n3和t3所占单元被释放.
程序返回到第二次调用中第2号语句的调用点,表达式n*fac(n-1)中,fac函数的返回值是2,n2中的值是3,因此表达式的值为6,赋给t2;接着执行第3号语句中的return语句,本次调用结束,返回函数值6,同时n2和t2所占单元被释放.
程序返回到第一次调用中第2号语句的调用点,表达式n*fac(n-1)中,fac函数的返回值是6,n1中的值是4,因此表达式的值为24,赋给t1;接着执行第3号语句中的return语句,本次调用结束,返回函数值24,同时n1和t1所占单元被释放.
程序返回到main主函数中的调用点,函数值为24 ,函数调用到此结束,继续执行其它语句.
个人感觉递归调用就是不断的在调用函数的时候开避新的变量,,把形参中的值赋值给新的变量,用新的变量当函数的新值再去调用函数本身,直到条件成立依次层层退出函数
弟归不难理解啊,说白就是调用函数,只不过是调用它本身,要设置好返回的条件就行了,不然会死循环:big 递归其实不难 就是自己调用自己而已 只是要避免死循环无限递归 就像一个数列的那种……第n个数和第n-1个数存在某种关系……汉诺塔……其实我也不太明白……
不过程序我倒是敲过一次了……
http://bbs.fishc.com/thread-45283-1-1.html
页:
[1]