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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© monian2014 中级黑马   /  2014-12-17 00:13  /  1967 人查看  /  5 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

题目:古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子对数为多少?

下边是代码:   兔子的规律为数列1,1,2,3,5,8,13,21...
int n = 10;
                System.out.println("第"+n+"个月兔子总数为"+fun(n));
        }
        private static int fun(int n){
                if(n==1 || n==2)
                   return 1;
                else
                   return fun(n-1)+fun(n-2);

前边的都没问题,那位可以解释一下 为什么是return fun(n-1)+fun(n-2);从字面上很好理解,我知道是一个递归的算法   问题是怎么从实际题目意思的角度去理解这个返回的语句. 高手赐教额:)

5 个回复

倒序浏览
递归算法的主要特点是一个问题的本身可以分解为其同类的子问题,而在这里return fun(n-1)+fun(n-2);的意思就是:这个月的兔子总数是前两个月兔子总数之和,这一点可以通过你给出的数列看出。当然,你也可以自己归纳出这个规律!
回复 使用道具 举报
递归就是函数本身调用自己
回复 使用道具 举报
谢谢大家的回复,大家还是没有明白我的意思, 当然可以从数组看出这个规律,我是说从题目内容本身推出来为什么这个月的兔子数量是前两月的之和.:)
回复 使用道具 举报
兔子的规律为数列1,1,2,3,5,8,13,21...可以看作是求斐波那契数列1,1,2,3,5,8,13,21...的n项和。
可以看出:F1=1,F2=1,F3=F(2)+F(1)=2
Fn=F(n-1)+F(n-2)(n >=3的整数)
Fn-1=F(n-2)+F(n-3)
.................................(往前递推得)
F3=F(2)+F(1)=2
最后问题简化成求F3
n个月兔子数量就是n-1,n-2个月数量之和,递推到F3,然后在用程序表达出来。
回复 使用道具 举报
递归的算法。。。和斐波那契数列很相似的。。。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马