一般而言,兔子在出生两个月后,就有繁殖能力,一对兔子每个月能生出一对小兔子来。如果所有兔子都不死,那么一年以后可以繁殖多少对兔子?
分析
简称:
a 代表 一对兔子a
a->b1 代表 一对兔子a生了一对小兔子b1
01月 a
02月 a
03月 a->b1
04月 a->b2, b1
05月 a->b3, b1->c1, b2
06月 a->b4, b1->c2, b2->d1, b3, c1
07月 a->b5, b1->c3, b2->d2, b3->e1, c1->f1, b4, c2, d1
...
看似复杂,其实规律很简单:
本月的兔子总数
=上月的兔子总数
+本月能生小兔子的兔子数
而本月能生小兔子的兔子数
=两个月前的兔子总数
,因为两个月前的兔子到现在都能繁殖了
综合前两个式子:本月的兔子总数
=上月的兔子总数
+两个月前的兔子总数
用公式表示为:
f(n) = f(n-1) + f(n-2)
其中f(1), f(2)是已知的,结果都是1.
解答
public static int fibonacci(int n) {
if(n == 1 || n == 2) {
return 1;
}
return fibonacci(n-1)+fibonacci(n-2);
}
结果:fibonacci(13) = 233
变体
题目改为: 一个农夫,买了一头小牛,这头小牛成长到第四年开始,会每年生一头小牛,所出生的小牛成长到第四年开始,也会每年生一头小牛,请问N年后,农夫共有多少头牛?
简称:
a 代表 一只牛a
a->b1 代表 一只牛a生了一只小牛b1
第一年 a
第二年 a
第三年 a
第四年 a->b1
第五年 a->b2, b1
第六年 a->b3, b1, b2
第七年 a->b4, b1->c1, b2, b3
第八年 a->b5, b1->c2, b2->d1, b3, b4, c1
第九年 a->b6, b1->c3, b2->d2, b3->e1, b4, c1, b5, c2, d1
分析过程类似:今年的牛总数=去年的牛总数+3年前的牛总数,即:
f(n) = f(n-1) + f(n-3)
其中f(1), f(2), f(3)是已知的,结果都是1.
解答
public static int fibonacci(int n) {
if(n == 1 || n == 2 || n == 3) {
return 1;
}
return fibonacci(n-1)+fibonacci(n-3);
}