您的位置:首页 > 编程语言 > Java开发

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.注意细节,循环执行多少次,自己要清楚。

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息