【神奇的兔子数列】

14天阅读挑战赛
努力是为了不平庸~
算法学习有些时候是枯燥的,这一次,让我们先人一步,趣学算法!

题目:有个很有名的数学逻辑题叫做不死神兔问题,假设第一个月有一对兔子,第二个月进入成熟期,第三个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问第十二个月的兔子对数为多少?

这个典型兔子数列即是斐波那契数列

1、问题分析:

首先不妨拿出生的一对小兔子分析。

第一个月,小兔子①没有繁殖能力,所以还是一对。

第二个月,小兔子①进入成熟期,还是一对。

第三个月,小兔子①生了一对小兔子②,于是第二个月共有2对兔子(1+1)。

第四个月,兔子①又生了一对小兔子③,兔子②进入成熟期,于是共有3对兔子(1+2)。

第五个月,兔子①生了一对兔子④,这个月兔子②也生了一对兔子⑤,因此改月共有5(2+3)对兔子。

......

以此类推,那么为了表达清楚,我们来看一下图解。

【神奇的兔子数列】_第1张图片

那么我们可以发现,这个数列有如下明细的特点,从第三个月开始,当月的兔子数=上月的兔子数+上上月的兔子数。因此前面两项之后便构成后一项。 

算法知识点

根据斐波那契数列如下:

1  1  2  3  5  8  13  21  34  ......

推出递归的表达式:

【神奇的兔子数列】_第2张图片

 得出了规律,我们就可以进行代码的实现

代码实现

 public static void main(String[] args) {
       
        //求解1
        //1.创建一个长度为12的数组
        int[] arr =new int[12];
        //2、手动给0、1索引数据赋值
        arr[0]=1;
        arr[1]=1;
        //3、利用循环给剩下的数据进行赋值
        for (int i = 2; i < arr.length; i++) {
            arr[i]=arr[i-1]+arr[i-2];

        }
        //4、获取最大索引上的数据即可
        System.out.println("第十二个月的兔子为:"+arr[11]);

        //求解2:用递归求解
        /*
        1、找到递归出口
        2、找到递归的规律
        Fn(12)=Fn(11)+Fn(10)
        Fn(11)=Fn(10)+Fn(9)
        ...
         Fn(3)=Fn(2)+Fn(1)
         Fn(2)=1
         Fn(1)=1
         */
        //获取方法得数据即可
        System.out.println("第十二个月的兔子为:"+getRabbitSum(12));


    }

    public static int getRabbitSum(int month){
        if (month==1||month==2){
            return 1;
        }
        return getRabbitSum(month-1)+getRabbitSum(month-2);
    }

相关算法题型题目总结

在进行代码实现的时候,需要注意递归算法的出口和规律,才能更好的解决题目。

通过这种小的算法题可以精进我们的编程能力和数据算法能力。在日常生活中也有很多递归的模型,欢迎大家参与讨论。

【神奇的兔子数列】_第3张图片

注:图片来源《趣味算法》第二版 

你可能感兴趣的:(算法)