/*【程序1】
题目:古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子对数为多少?
1.程序分析: 兔子的规律为数列1,1,2,3,5,8,13,21....
*/
其实这个问题是找规律得出公式,其中规律是nx=(n-1)x+(n-2)x;//其实我也不知道公式该不该这么写,写出来感觉哪里不对
根据所得出的公式解决来写代码,使用递归
/*
* 【程序1】 题目:古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,
* 问每个月的兔子总数为多少? 1.程序分析: 兔子的规律为数列1,1,2,3,5,8,13,21,34,55....
*/
public static long TuZi01(int month) {
if (month < 3) {
return 1l;
} else if (month == 3) {
return 2l;
}
return TuZi01(month - 1) + TuZi01(month - 2);
}
代码是写出来了,但是测试的时候出现了一个问题,那就是当月份越大越慢,当月份为60的时候将近执行运算了1分钟。
哇,那这算法学个毛线,于是想了想问题出在了递归上,因为是直接调用method所以数量越大调用的越多,而且本身是在重复调用,于是用一个数组来储存临时的每个月的兔子数,这样会省去一定的运算。
/*
* 【程序1】 题目:古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,
* 问每个月的兔子总数为多少? 1.程序分析: 兔子的规律为数列1,1,2,3,5,8,13,21,34,55....
*/
class ShengTuZi {
long[] tuzi = new long[2048];
public long TuZi01(int month) {
if (month < 3) {
return 1l;
} else if (month == 3) {
return 2l;
}
if (tuzi[month] == 0) {
tuzi[month] = TuZi01(month - 1) + TuZi01(month - 2);
}
return tuzi[month];
}
}
然后我看了标准答案。。。。。。。。。擦,感觉用递归有点low,而且我没看清题目,要算出每个月的兔子对数。。。擦
public static void main(String[] args){ int MONTH = 50; long f1 = 1L, f2 = 1L; long f; for (int i = 3; i < MONTH; i++) { f = f2; f2 = f1 + f2; f1 = f; System.out.print("第" + i + "个月的兔子对数: "); System.out.println(" " + f2); } }