java之不死神兔(斐波那契数列)
2016-08-11 17:11
155 查看
1.需求
有一对兔子,从出生后第三个月开始每月生一对兔子,小兔子从第三个月开始每月也生一对兔子,加入是不死神兔,那么第20个月一共生多少对兔子?2.分析
第一个月兔子对数: 1第二个月兔子对数:1
第三个月兔子对数:2
第四个月兔子对数:3
第五个月兔子对数:5
第六个月兔子对数:8
....
斐波那契数列:1,1,2,3,5,8...
3.方法实现(三种方法)
数组实现相邻变量规律实现
递规实现
思路:先写出几个(大部分都是这样的思想,第一次、第二次、第三次,然后规律就出来了),然后找规律。
代码体现
public class RabbitTest { public static void main(String[] args) { // 方法1 int[] array = new int[20]; // 从第三个月开始,是前两个数的和array[2]=array[1]+array[0] array[0] = 1;// 已知 array[1] = 1;// 已知 for (int x = 2; x < array.length; x++) { array[x] = array[x - 1] + array[x - 2]; } System.out.println("第20个月的兔子对数是:" + array[array.length - 1]); // 方法2(相邻取值法) /* * 假设相邻的兔子对数是x,y 第一个相邻数据: x=1,y=1 * 第二个相邻数据: x=1,y=2 第三个相邻数据: x=2,y=3 * 第四个相邻数据: x=3,y=5 第五个相邻数据: x=5,y=8 ..... * 第x次的x是上一次的y值,第x次的y是上一次的x和y之和 */ int x = 1;// 已知 int y = 1;// 已知 // 为什么18次循环呢?因为从第二次开始x=1,y=1+1的,少一次,3个数据相邻的次数只有2次,,所以由少一次,所以18次 for (int i = 0; i < 18; i++) { int tempx = x;// 上一次的x int tempy = y;// 上一次的y x = tempy; y = tempx + tempy; } System.out.println("第20个月的兔子对数是:" + y); // 方法3 //递规方法 System.out.println("第20个月的兔子对数是:" + getSum(20)); } // 递规实现 // 方法返回值类型int,参数列表int month,出口条件month=1或者month=2,规律前两个月之和 public static int getSum(int month) { if (month == 1 || month == 2) return 1; else return getSum(month - 1) + getSum(month - 2); } }
4.归纳总结
1.递规思想
①必须要有方法②要有出口条件,不然就是死递规③必须有规律注意:递规次数不能太多,否则每次调用一次方法就在栈内存加载一次,然后到出口条件依次出栈,次数过多会导致内存溢出。
2.注意细节,循环执行多少次,自己要清楚。
相关文章推荐
- 扩展的斐波那契数列:求兔子个数
- C++模板编程:如何在编译器确定斐波那契数列?
- 母牛生小牛[特殊的斐波那契数列]
- 大数斐波那契数列的求法(大数相加)
- 编程之美-2.9-斐波那契数列
- 使用递归实现斐波那契数列
- 斐波那契数列
- 对数步计算斐波那契数列
- 斐波那契数列(记忆化搜索)
- poj1953_斐波那契数列
- 类斐波那契数列问题
- 分治法(归并排序,X^n以及斐波那契数列)
- 斐波那契数列
- 递归算法计算斐波那契数列的第30个数
- 斐波那契数列(java/c++)
- 记忆话搜索来实现斐波那契数列
- HDU 4549 M斐波那契数列
- 分别使用递归方法和非递归方法求斐波那契数列,并比较两者的运行速度(测量代码运行时间)
- Android NDK入门实例 计算斐波那契数列一生成jni头文件
- 斐波那契数列的