古典問題:關於兔子的生命週期。

面試題:有一對兔子,從出生後第3個月起每個月都生一對兔子,小兔子長到第三個月後每個月又生一對兔子,假如兔子都不死,問每個月的兔子總數爲多少?


package com.collection;

import java.util.Arrays;


public class RecursiveDemo {
	public static void main(String[] args) {
		/**
		 *	有一對兔子,從出生後第3個月起每個月都生一對兔子,小兔子長到第三個月後每個月又生一
		 *對兔子,假如兔子都不死,問每個月的兔子總數爲多少?
		 *
		 *已知開始已有一對兔子(A),
		 *	第1個月:A兔子  =1對
		 *	第2個月:A兔子 =1對
		 *	第3個月:大兔子A生了小兔子B =2對
		 *	第4個月:大兔子A生了小兔子C,  A+B+C=3對。。      	 	注:兔子滿3個月後,就每月都生一對。
		 *	第5個月:大兔子A生了小兔子D,大兔子B(滿3個月)生了小兔子E。  A+B+C+D+E=5對。
		 *	第6個月:大兔子A生了小兔子F,大兔子B生了小兔子G,大兔子C生了小兔子H。	A+B+C+D+E+F+G+H= 8對
		 *	.....
		 *	規律:1,1,2,3,5,8...
		 *		從第3位開始的數之和來自前兩位。
		 */
		
		//已知數據。
		int num = 1;
		int two = 1;
		/**	
		 * 	第1個月
		 * 		num=1,two=1
		 *  第2個月
		 *  	num=1,two=2	
		 *  第3個月
		 *  	num=2,two=3
		 *  第4個月
		 *  	num=3,two=5
		 *  第5個月
		 *  	num=5,two=8
		 *  規律發現:num是以前的two,而two是等於之前num+two。
		 */
		for(int x = 3;x <= 20;x++)
		{ 
			int temp = two;//記錄之前two
			two = num+two;//將前num與two相加等於two,
			num = temp;//再將之前的tow賦給num
			System.out.println(num+"***"+two);
		}
		System.out.println("count="+two);
		/**
			1***2
			2***3
			3***5
			5***8
			8***13
			13***21
			21***34
			34***55
			55***89
			89***144
			144***233
			233***377
			377***610
			610***987
			987***1597
			1597***2584
			2584***4181
			4181***6765
		 */
		int[] arr = new int[20];
		arr[0] = 1;
		arr[1] = 1;
		for(int x = 2; x < arr.length;x++)
		{
			/**
			 * 	x = 2:表示第3月
			 * 		arr[2] = arr[0] + arr[1];		//此時數組數量爲:arr[0] = 1,arr[1] = 1,arr[2] = 2
			 *  x = 3:表示第4月
			 * 		arr[3] = arr[2] + arr[1];		//此時數組數量爲:arr[0] = 1對,arr[1] = 1對,arr[2] = 2對,arr[3] = 3對
			 * x = 4:表示第5月
			 * 		arr[4] = arr[3] + arr[2];		//此時數組數量爲:arr[0] = 1對,arr[1] = 1對,arr[2] = 2對,arr[3] = 3對  ,arr[4] = 5對
	  		 * x = 5:表示第6月
			 * 		arr[5] = arr[4] + arr[3];		//此時數組數量爲:arr[0] = 1對,arr[1] = 1對,arr[2] = 2對,arr[3] = 3對  ,arr[4] = 5對,arr[5] = 8對  
			 * x = 6:表示第7月
			 * 		arr[6] = arr[5] + arr[4];		//此時數組數量爲:arr[0] = 1對,arr[1] = 1對,arr[2] = 2對,arr[3] = 3對  ,arr[4] = 5對,arr[5] = 8對,,arr[6] = 13對
			 */
			arr[x] = arr[x-1] + arr[x-2];//3月=第3-1月+第3-2月 		 4月=第4-1月+第4-2月
		}
		System.out.println("count="+arr[arr.length-1]);
		
		//遞歸實現
		System.out.println("count="+rec(20));
	}
	/**
	 * 	遞歸特點:先分解,再合併!
	 * 	1,1,2,3,5,8,13
	 */
	public static int rec(int i) {
		if(i==1 || i==2)
			return 1;
		else
			return rec(i-1)+rec(i-2);
	}
}

發佈了56 篇原創文章 · 獲贊 16 · 訪問量 20萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章