java算法-兔子對數問題

package com.zhangxing.arthmetic;

/**
 * 古典問題:有一對兔子,從出生後第3個月起每個月都生一對兔子,
 * 小兔子長到第三個月後每個月又生一對兔子,
 * 假如兔子都不死,問每個月的兔子總數爲多少?
 * 程序分析: 兔子的規律爲數列1,1,2,3,5,8,13,21....  
 * @author zhangxing
 * 
 */
public class FirstRabbit {
	
	/**
	 * 
	 * @param month , pair
	 * @return pairOfRabbits
	 */
	public long getPairOfRabbits(long month , long pair){
		
		//參數校驗
		boolean checkMonthResult = checkMonth(month);
		boolean checkMonthPair = checkPair(pair);
		//定義初始變量兔子總對數
		//int pairOfRabbits = 0;
		//考慮到數值會非常大,所以該處改爲long
		long pairOfRabbits = 0;
		//1.先判斷校驗是否通過
		if(checkMonthResult && checkMonthPair){
			if(month <= 2){
				pairOfRabbits = 1;
			}else{
				//因爲一直訪問的是該函數本身,所以用了遞歸算法,公式:第三個月的爲前兩個之和
				pairOfRabbits = getPairOfRabbits(month-1 ,1) + getPairOfRabbits(month-2 ,1);
			}
		}
		return pair * pairOfRabbits;
	}

	//對傳入的初始兔子對數進行校驗
	private  boolean checkPair(long pair) {
		if(pair < 0){
			//目前是打印在console,正常情況下放在日誌下,logger.log();
			System.out.println("【輸入的兔子對數不合法!】");
			return false;
		}
		return true;
	}
	
	//對傳入的月份進行校驗
	private  boolean checkMonth(long month) {
		if(month < 0){
			//目前是打印在console,正常情況下放在日誌下,logger.log();
			System.out.println("【輸入的月份不合法!】");
			return false;
		}
		return true;
	}
}

最近對算法產生了很濃的興趣,網上找了找經典的算法題。

但是經過簡單的測試後發現問題,效率太慢。原因在於遞歸算法本身對該方法訪問的次數太多。

針對這個問題,去網上找了一下源碼。

   long f1 = 1L, f2 = 1L;
			   long f;
			   for(int i=3; i<50; i++) {
			    f = f2;
			    f2 = f1 + f2;
			    f1 = f;
			    System.out.print("第" + i +"個月的兔子對數: ");
			    System.out.println(" " + f2);
			  }
發現源碼的速度非常快,當時就對此非常詫異,研究後發現了以前學習數據結構時候講到的複雜度問題,目前正在研究中,也請大家不吝賜教~

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