演算法---兔子生小兔子
阿新 • • 發佈:2019-01-09
演算法—兔子生小兔子
題目:有一對兔子,從出生後第3個月起每個月都生一對兔子,小兔子長到第三個月後每個月又生一對兔子,假如兔子都不死,問每個月的兔子總數為多少?
分析:
兔子的規律為數列:1, 1, 2, 3, 5, 8, 13, 21 ….
分析:
這道題表現的本質就是斐波那契數列 f(0)=0,f(1)=1…f(n)=f(n-1)+f(n-2) (當前項等於前兩項之和)。
兔子總對數 = 成年兔子對數+幼年兔子對數
成年兔子對數 = 前月成年兔子對數+前月幼年兔子對數 = 前月總對數
幼年兔子對數 = 前月成年兔子對數 = 大前月兔子總對數(由上條公式得到)
最終推導公式:兔子總對數 = 前月兔子總對數+大前月兔子總對數! 這個公式正好符合Fibonacci數列
void rabitFibonacci(){
long f1,f2;
int i;
f1=f2=1;
for(i=1;i<=20;i++)
{
printf("%12ld %12ld",f1,f2);
if(i%2==0) printf("\n");/*控制輸出,每行四個*/
f1=f1+f2;/*前兩個月加起來賦值給第三個月*/
f2=f1+f2;/*前兩個月加起來賦值給第三個月*/
}
}
遞迴演算法
因為每對兔子從出生到生產的過程是一致的,所以我考慮是不是封裝一個方法來表示兔子的這一過程,然後用遞迴實現
//遞迴實現 返回第一對兔子和之後所有小兔子生下的總兔子對數
int rabits(int month){
int r = 0;
for(int i=2;i<=month;i++){
r+=rabits(month-i);//從第3個月起每個月生一堆兔子
}
return 1 + r;//這隻兔子升的小兔子的總對數
}
這個方法我認為從解決問題的角度不失為一個好方法。但對規律問題考慮不深入,也屬於就事論事。