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)=1Fn(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);}
相关算法题型题目总结
在进行代码实现的时候,需要注意递归算法的出口和规律,才能更好的解决题目。
通过这种小的算法题可以精进我们的编程能力和数据算法能力。在日常生活中也有很多递归的模型,欢迎大家参与讨论。
注:图片来源《趣味算法》第二版