java之不死神兔(斐波那契数列)

来源:互联网 发布:如何建立网络打印机 编辑:程序博客网 时间:2024/04/30 15:10

1.需求


有一对兔子,从出生后第三个月开始每月生一对兔子,小兔子从第三个月开始每月也生一对兔子,加入是不死神兔,那么第20个月一共生多少对兔子?


2.分析


第一个月兔子对数:   1
第二个月兔子对数:1
第三个月兔子对数:2
第四个月兔子对数:3
第五个月兔子对数:5
第六个月兔子对数:8
....
斐波那契数列:1,1,2,3,5,8...


3.方法实现(三种方法)

  1. 数组实现
  2. 相邻变量规律实现
  3. 递规实现
思路:先写出几个(大部分都是这样的思想,第一次、第二次、第三次,然后规律就出来了),然后找规律。

代码体现
public class RabbitTest {public static void main(String[] args) {// 方法1int[] 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;// 上一次的xint tempy = y;// 上一次的yx = 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;elsereturn getSum(month - 1) + getSum(month - 2);}}


4.归纳总结


1.递规思想

①必须要有方法②要有出口条件,不然就是死递规③必须有规律 
注意:递规次数不能太多,否则每次调用一次方法就在栈内存加载一次,然后到出口条件依次出栈,次数过多会导致内存溢出。

2.注意细节,循环执行多少次,自己要清楚。

0 0
原创粉丝点击