一道經典的算法問題。
題目:有一對兔子,從出生后第3個月起每個月都生一對兔子,小兔子長到第三個月后每個月又生一對兔子。假如兔子都不死,要求輸出一年內兔子的數量是多少。
1 1 2 3 5 8……
代碼如下:
//兔子問題(斐波那契)
package
com.hxzy.homework;
public
class
HomeWork05 {
public
static
void
main(String[] args) {
// TODO Auto-generated method stub
int
month =
12
;
int
sum = fab(month);
System.out.println(sum); //按兔子繁殖規律
System.out.println(fab_1(month)); //按斐波拉契
}
//--------按兔子繁殖規律
static
int
fab(
int
month){
if
(month<=
2
)
return
1
;
else
if
(month==
3
)
return
2
;
else
return
2
*fab(month-
1
)-fab(month-
3
);
// 即 return fab(month-1) +(fab(month-1)-fab(month-2)) +(fab(month-2)-fab(month-3));
// 返回值為,上月兔子數+上月增加的兔子數+兩個月前新增兔子數
}
//--------------按斐波拉契
static
int
fab_1(
int
n){
if
(n<=
2
)
return
1
;
else
return
fab_1(n-
1
)+ fab_1(n-
2
);
}
}
用遞歸法求解最簡單,上面代碼fab()是根據題意寫出的代碼。由於兔子第三個月開始會生小兔子,所以此道題目的關鍵邏輯是:
本月兔子數=上月兔子數 + 上月增加的兔子數 + 兩個月前新增兔子數,
即:fab(n) = fab(n-1) +(fab(n-1)-fab(n-2)) + (fab(n-2)-fab(n-3));
亦即:fab(n)=2*fab(n-1) - fab(n-3)
這一邏輯較斐波那契數列更好理解。