A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 孙铭泽 中级黑马   /  2012-8-25 21:29  /  2834 人查看  /  6 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

裴波那切数列:
* 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);
                }
        }
}
(这个函数在执行的时候到最后的  “出口”我没怎么理解过来 求大神帮忙看看  递归是怎么执行的)。

评分

参与人数 1技术分 +1 收起 理由
张_涛 + 1 赞一个!

查看全部评分

6 个回复

倒序浏览
本帖最后由 应广驰 于 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, 然后自己用手工执行运行一下代码,也就是手动模仿电脑执行,一步步写出来

如果还是不行的话,就找本书,或百度一点点的看吧。最好还是手动的写下每步运行代码

评分

参与人数 1技术分 +1 收起 理由
张_涛 + 1 赞一个!

查看全部评分

回复 使用道具 举报
递归需要自己慢慢理解,这里说不清楚,最好让别人当面给你讲
回复 使用道具 举报
楼主都搞了十八分了,求指导如何挣分

评分

参与人数 1黑马币 +30 收起 理由
张_涛 + 30 神马都是浮云

查看全部评分

回复 使用道具 举报
没做出递归来。求解。晕......
很笨的方法。
        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;
                }
        }
回复 使用道具 举报
if (n == 1 || n == 2) {
                         return 1;
这句不就是出口吗?
停止调用自身就出去了呗。
回复 使用道具 举报
要理解递归的执行过程,先得弄懂:栈!数据结构中的知识。建议看看再说。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马