网上看到这个题目,直接看到答案,不是很理解,还是按照自己梳理了一遍。
首先,我先搞了一个二维数组,3个数字记录每个月状态是新生的兔子,2个月大的兔子,3个月大的兔子,
public static int test0() {
int i = 0;
int m = 20;
int[][] a = new int[20][3];
a[0][0] = 1;// 新出生的兔子
a[0][1] = 0;// 2个月的兔子
a[0][2] = 0;// 3个月的兔子
for (int n = 1; n < m; n++) {
a[n][0] = a[n - 1][1] + a[n - 1][2];// 刚出生的兔子,上个月状态是第二个月的兔子+第三个月的兔子
a[n][1] = a[n - 1][0];// 状态是第二个月的兔子 = 上个月1个月的兔子
a[n][2] = a[n - 1][1] + a[n - 1][2];// 状态是三个月的兔子=上个月2个月的兔子+上个月三个月的兔子
System.err.println("第" + (n+1) + "个月的兔子为:" + (a[n][0] + a[n][1] + a[n][2]));
}
return i;
}
此上算出来
第 1 月份,兔子的数量为: 1
第 2 月份,兔子的数量为: 1
第 3 月份,兔子的数量为: 2
第 4 月份,兔子的数量为: 3
第 5 月份,兔子的数量为: 5
第 6 月份,兔子的数量为: 8
第 7 月份,兔子的数量为: 13
第 8 月份,兔子的数量为: 21
第 9 月份,兔子的数量为: 34
第 10 月份,兔子的数量为: 55
第 11 月份,兔子的数量为: 89
第 12 月份,兔子的数量为: 144
第 13 月份,兔子的数量为: 233
第 14 月份,兔子的数量为: 377
第 15 月份,兔子的数量为: 610
第 16 月份,兔子的数量为: 987
第 17 月份,兔子的数量为: 1597
第 18 月份,兔子的数量为: 2584
第 19 月份,兔子的数量为: 4181
第 20 月份,兔子的数量为: 6765
发现第三个月等于第一个月+第二个月
依次内推,可以吧算法写成
/**
* 这是分析数字结构的结果,等于前一个月+前2个月
*/
public static void test1() {
for (int i = 1; i <= 20; i++) {
int num = getNum(i);
System.out.println("第 " + i + " 月份,兔子的数量为: " + num);
}
}
/**
* 获取前2个数字相加,
*
* @param i
* @return
*/
public static int getNum(int i) {
if ((i == 1) || (i == 2)) {
return 1;
} else {
return getNum(i - 1) + getNum(i - 2);
}
}
如果吧3改成2,2个月就生的话,
/**
* 如果第2个月就生,那么就是1,2,4,8,可以直接上个月数字*2
*/
public static int test2() {
int i = 0;
int m = 20;
int[][] a = new int[20][2];
a[0][0] = 1;// 新出生的兔子
a[0][1] = 0;// 2个月的兔子
for (int n = 1; n < m; n++) {
a[n][0] = a[n - 1][0] + a[n - 1][1];//
a[n][1] = a[n - 1][0] + a[n - 1][1];;//
System.err.println("第" + (n+1) + "个月的兔子为:" + (a[n][0] + a[n][1] ));
}
return i;
}
这样就是双倍放大。。。。。