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);
}
發現源碼的速度非常快,當時就對此非常詫異,研究後發現了以前學習數據結構時候講到的複雜度問題,目前正在研究中,也請大家不吝賜教~