算法学习01- 生兔子的问题

来源:互联网 发布:廊坊北商网络 编辑:程序博客网 时间:2024/06/05 19:18

/*【程序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);}}

 
原创粉丝点击