一、小知識(概念 + 趣味故事)
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