一般而言,兔子在出生两个月后,就有繁殖能力,一对兔子每个月能生出一对小兔子来。如果所有兔子都不死,那么一年以后可以繁殖多少对兔子?

分析

简称: 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); }

results matching ""

    No results matching ""