问题描述
有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问第二十个月的兔子 对数 为多少?
问题分析
分析:从第一个兔子开始,第1个月1对兔子,由于“长到第三个月后每个月又生一对兔子”,所以第2个月也是1对兔子,第3个月时可以生一对兔子,所以总数为2对,这时,其中有一对是以后每个月都可以生一对兔子的老兔子,另一对是一对新兔子,它只有在第三个月的时候才可以每个月生一对兔子;这样的话,第4个月的兔子总数为3对,…以此类推,从第1个月到第12个月的兔子总对数分别为:1,1,2,3,5,8,13,21,34,55,89,144
发现规律
A:从第三项开始,每一项是前两项之和
B:而且说明前两项是已知的
代码实现
A:变量的变化实现
public static void main(String[] args) { //要计算的月数 int month = 12; //兔子总对数 int count = 0; //上个月的总对数,初始化为2月的,有1对 int num1 = 1; //上上个月的总对数,初始化为1月的,有1对 int num2 = 1; for (int i = 3; i <=12 ; i++) { count = num1 + num2; num2 = num1; num1 = count; System.out.println("第"+i+"个月有"+count+"只兔子!"); } }
B:数组实现
public static void main(String[] args) { // 定义一个数组,存放每个月兔子的总对数 int[] arr = new int[12]; arr[0] = 1; arr[1] = 1; // arr[2] = arr[0] + arr[1]; // arr[3] = arr[1] + arr[2]; // ... for (int x = 2; x < arr.length; x++) { arr[x] = arr[x - 2] + arr[x - 1]; } //打印每一个月兔子的总对数 for (int i= 1; i < arr.length; i++) { System.out.println("第"+i+"个月有"+arr[i]+"对兔子!"); } }
C:递归实现
public class Test003 { /** * 递归计算兔子数量 * @param month * @return */ public static int getRabbitNum(int month) { if (month == 1 || month == 2) { return 1; } else { return getRabbitNum(month - 1) + getRabbitNum(month - 2); } } public static void main(String[] args) { int month = 12; System.out.println("第"+month+"个月有"+getRabbitNum(12)+"对兔子!"); } }