问题描述:
有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子。假如兔子都不死,要求输出N个月内兔子的数量是多少。
问题分析:
从问题描述可以得知,每只兔子在出生后都需要一个成长期来发育,等到成熟期时才能开始生殖新的兔子,并且可以一直不死亡,可以一直生殖。所以
- 第一个月:一对初始的兔子
- 第二个月:兔子在成长
- 第三个月:两对兔子,第二对刚出生
- 第四个月:三对兔子,第二对在成长,第三对刚出生
- 第五个月:五对兔子,第三对兔子在成长,出生4,5
- 第六个月:八对兔子,第四队第五对在成长,本次出生6,7,8,
- 第七个月:13对兔子:第6,7,8在成长,出生,9,10,11,12,13
- 从上述情况可看出,每个月的兔子数量是上一个月的基础数量加上上上个月的兔子的数量(上上个月的兔子在这个月就会处于成熟生殖状态,每一对兔子都能生一对新的兔子)
- 在编程中,解决这类问题可以使用,递归的方法来解决,即使方法体自己调用自己。
代码实现:
public class RecursionRabbits {
public static void main(String[] args) {
System.out.println("您想计算多少个月后兔子的数量:");
Scanner key=new Scanner(System.in);
int month=key.nextInt();
System.out.println("该月的兔子数量为:"+born(month));
key.close();
}
public static int born(int month) {
//第一对兔子还处在成长期,所以前两个月的兔子数量都是一
if(month==1||month==2) {
return 1;
}else {
//从第三个月开始,上上个月的兔子就处于成熟期,可以开始生小兔子
return born(month-1)+born(month-2);
}
}
}
在这个代码中,born方法的返回值为int,int的最大值为2147483647,所以当月份较大的时候,可能会超出这个最大值,造成异常。