黑马程序员技术交流社区
标题:
递归的 误区
[打印本页]
作者:
孙铭泽
时间:
2012-8-25 21:29
标题:
递归的 误区
裴波那切数列:
* 1,1,2,3,5,8,13,...
*
* 求第二十项的值:
* 规律:第一项和第二项的值都是1,其后每项的值是前两项的和。
}public static int dg(int n) {
if (n == 1 || n == 2) {
return 1;
} else {
return dg(n - 1) + dg(n - 2);
}
}
}
(这个函数在执行的时候到最后的 “出口”我没怎么理解过来 求大神帮忙看看 递归是怎么执行的)。
作者:
广驰
时间:
2012-8-25 21:33
本帖最后由 应广驰 于 2012-8-25 21:51 编辑
这个你要是理解栈的概念就很容易理解了,首先这个函数你要求第二十项,那么就传入n=20,这时候dg(20)就压入了栈中,然后判断,执行dg(n-1)也就是dg(19),把dg(19)压入栈中,继而调用dg()函数传入n=19,继续执行,直到执行到n=1时候的时候,这个时候最后压到栈中的dg(1)就会返回一个结果1
然后给dg(2),dg(2)又直接返回结果给dg(3)
重点在这里,这个时dg(3)中执行到dg(n - 1) + dg(n - 2)前面的dg(n-1)也就是dg(2)已经有结果返回了,所以开始执行dg(n-2)注意这个时候n的参数是3
因为这时栈顶的就是dg(3),然后计算右边的dg(n-2)也就是dg(1),返回结果为1,这个时候,就有dg(3) 的dg(n - 1) + dg(n - 2) 就有结果了,然后就有一个返回值,这个值,被返回给调用者dg(4),然后dg(4)又重复执行压栈操作,知道有结果返回,这样dg(4)出栈,再到dg(5)之后也是一样,一直到栈底的dg(20)计算出结果,这个n=20其实就是出口,
如果你真的看不懂,建议可以把n的值设置为4, 然后自己用手工执行运行一下代码,也就是手动模仿电脑执行,一步步写出来
如果还是不行的话,就找本书,或百度一点点的看吧。最好还是手动的写下每步运行代码
作者:
杨震
时间:
2012-8-25 21:37
递归需要自己慢慢理解,这里说不清楚,最好让别人当面给你讲
作者:
杨震
时间:
2012-8-25 21:41
楼主都搞了十八分了,求指导如何挣分
作者:
黑马-李勇
时间:
2012-8-26 00:51
没做出递归来。求解。晕......
很笨的方法。
public static void fbnq1(int end)
{
int x=1,y=1; //输出两个1.
System.out.print(x+",");
System.out.print(y+",");
int t=0; //临时值
for (int i=2;i<=end;i++)
{
System.out.print(x+y+",");
t=0; //计算x,y的下一个数。
t=x;
x=y;
y=t+x;
}
}
作者:
黑马_许芸
时间:
2012-8-26 08:45
if (n == 1 || n == 2) {
return 1;
这句不就是出口吗?
停止调用自身就出去了呗。
作者:
高廷平
时间:
2012-8-26 19:06
要理解递归的执行过程,先得弄懂:栈!数据结构中的知识。建议看看再说。
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2