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.注意細節,循環執行多少次,自己要清楚。

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