【php】神奇的斐波那鍥數列(遞歸 + 非遞歸)實現

一、小知識(概念 + 趣味故事)

1、斐波那契數列:

1 1 2 3 5 8 13 21 34 55 …

概念:

前兩個值都爲1,該數列從第三位開始,每一位都是當前位前兩位的和

規律公式爲:

Fn = F(n-1) + F(n+1)

F:指當前這個數列

n:指數列的下標

2、永生的兔子

斐波納契早年思考一個關於兔子繁殖的數學問題:從一隻雄兔和一隻雌兔開始,一年能生多少對兔子?該問題假設了以下條件:從一隻剛出生的公兔和母兔開始。兔子在一個月後達到性成熟。兔子的妊娠期是一個月。雌性兔子性成熟後,每月生育一次。一隻母兔子生了一隻公兔子和一隻母兔子。兔子不會死。如下圖所示:

 

二、源代碼(遞歸 + 非遞歸)實現

<?php
    function test() {
        $x = 39; //自增量 可變
        $star_time = time();
        //斐波那鍥數列 遞歸調用
        $arr = [];
        for ($i=1; $i<=$x; $i++) {
            $arr[] = f_digui($i);
        }

        //非遞歸方式生成
        $arr2 = fbnq($x);

        $end_time = time();
        echo "<pre>"; print_r($arr);
        echo "<pre>"; print_r($arr2);
        echo "<pre>"; print_r($star_time - $end_time);exit;
    }

    //非遞歸寫法:
    function fbnq($n){  //傳入數列中數字的個數
        if($n <= 0){
            return 0;
        }
        $array[1] = $array[2] = 1; //設第一個值和第二個值爲1
        for($i=3;$i<=$n;$i++){ //從第三個值開始
            $array[$i] = $array[$i-1] + $array[$i-2];
            //後面的值都是當前值的前一個值加上前兩個值的和
        }
        return $array;
    }
    
    //遞歸寫法:
    public function f_digui($n){
        if($n == 1 || $n == 2) return 1;
        return f_digui($n - 1) + f_digui($n - 2);
    }

二、結果演示 :由於php和python是單進程的,跑的過程中發現以下兩個神奇的事情:

1、當自變量達到40的時候程序會異常, 跑不動,這個時候數據剛過億, 是不是就是傳說中的奇點

2、數值越大, 前後的兩個數字之比越接近0.618

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章