兔子生兔子問題(斐波那契數列)


一道經典的算法問題。

題目:有一對兔子,從出生后第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)

這一邏輯較斐波那契數列更好理解。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM