1. 程式人生 > >演算法---兔子生小兔子

演算法---兔子生小兔子

演算法—兔子生小兔子

題目:有一對兔子,從出生後第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;//這隻兔子升的小兔子的總對數
}

這個方法我認為從解決問題的角度不失為一個好方法。但對規律問題考慮不深入,也屬於就事論事。