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

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章