生兔子问题-看这一篇就够了

来源:互联网 发布:svd分解 对角矩阵 编辑:程序博客网 时间:2024/04/30 04:44

生兔子是一个古老又经典的算法题,题目如下

有1只兔子,第三个月开始每个月会生下1只兔子,生下来的兔子在它的第三个月又会生出一只兔子,以此类推第n个月有多少只 兔子

我们可以简单列一下月份和兔子数

月1234567兔子数11235813

当然这种数据还可以继续往后写很多,我们主要找他们的规律

前两个月原始兔子不会生育,没有异议,第三个月开始它生了一只兔子,也就是1+1,有2只兔子,注意红色的兔子下个月不会生育,所以第四个月的兔子总数为1+1+1,有3只兔子,红色的是刚出生的,青色的是上个月出生的,青色兔子在下个月就可以生小兔子了,所以第五个月的兔子总数是1+1+1+2,这里上个月青色的兔子由于可以生育了,我把它变成黑色的1,而上个月红色的,我变成了青色的1标识它下个月可以生兔子了,而这个月刚出生的2只我用红色标识,所以第五个月有5只兔子,那么看第六个月是1+1+1+2+3,上个月青色的由于这个月可以生兔子了所以变成黑色的1了,上个月红色的2这个月变成青色的2说明下个月可以生兔子了,而这个月由于有3个黑色的1在生兔子所以出生3只兔子并且用红色标记,所以第六个月有8只兔子,第七个月以此类推1+1+1+2+3+5,不用解释了是13只兔子

说了这么多,可以总结出一个规则,就是生个月新出生的兔子这个月不会生兔子,而再上一个月的兔子这个月都会生产,如果当前月份是n的话可以得出:

第n个月的兔子总数是,n-2个月兔子总数乘以2加上n-1个月出生的兔子,如果f(n)代表第n个月的兔子总数的话,则有:

第n个月兔子总数 = 第n-2个月兔子总数*2 + 第n-1个月新出生的兔子(新出生的兔子可不是f(n-1),而是f(n-1)减去f(n-2))

f(n)                         = (f(n-2)) * 2                     + (f(n-1) - f(n-2))     =f(n-1) + f(n-2)

这就是最经典的斐波那契数列,也叫费氏数列,那么我们用代码实现下

public class Tuzi {public static int getNum(Integer n){if(n==0){System.out.println("没有第0个月别胡闹");return 0;}//如果是if(n==1||n==2){return 1;}else{return getNum(n-1) + getNum(n-2);}}public static void main(String args[]){System.out.println(getNum(7));}}


以上就是最经典的生兔子算法,采用费氏数列解答


原创粉丝点击