小白兔生小白兔-菲波拉契數列問題

有一對小白兔,從出生後第3個月起每月都生一對小白兔,小白兔長到第三個月後每月又生一對小白兔,假如小白兔都不死,問每月的小白兔總數爲多少?算法

這道題是典型的斐波拉切數列問題,其特色就是從第三列開始就等於前兩列之和,算法: F(n)=F(n-1)+F(n-2)spa

列出三種實現方式:code

    /**
     * 遞歸算法  F(n)=F(n-1)+F(n-2)
     * @param n 月數
     * @return
     */
    public static int rabbitCalculate(int n){
        return n <= 2 ? 1 : (rabbitCalculate(n-1) + rabbitCalculate(n-2));
    }

 

   /**
     * 根據公式循環計算 F(n)=F(n-1)+F(n-2)
     * @param n 月數
     */
    public static void rabbitCalculate2(int n){
        int [] arr=new int[n+1];
        arr[0]=0;
        arr[1]=1;
        int now=0;
        System.out.println("第1個月兔子對數:"+arr[1]);
        for (int i = 2; i <=n ; i++) {
            arr[i]=arr[i-1]+arr[i-2];
            now=arr[i];
            System.out.println("第"+i+"個月兔子對數:"+now);
        }
        System.out.println("月兔子對數:"+now);
    }

 

   /**
    * 藉助臨時變量進行計算
     * @param n 月數
    */
    public static void rabbitCalculate3(int n){
        int previous=1,now=1,temp,begin=3;
        System.out.println("第1個月兔子對數:"+previous);
        System.out.println("第2個月兔子對數:"+previous);
        for (int i = begin; i <= n; i++) {
           temp=now; // 記錄前一個now備用
             now=previous+now; // 算出當前now值
             previous=temp; // 將記錄的位置值賦給previous
           System.out.println("第"+i+"個月兔子對數:"+now);
        }
    }

結束blog

相關文章
相關標籤/搜索