【神奇的兔子数列】

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

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

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

1、问题分析:

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

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

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

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

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

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

......

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

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

算法知识点

根据斐波那契数列如下:

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

推出递归的表达式:

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

代码实现

 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);
    }

相关算法题型题目总结

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

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

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

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

居然天上楼

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值