斐波那契數列,即兔子問題;演算法筆試題可能會出現;
function fun($n)return fun($n-1) + fun($n-2
);}
效能問題: 1,自身巢狀太深,可能會引起堆疊溢位;
堆疊溢位:函式呼叫會使用棧來儲存臨時變數。每呼叫乙個函式,都會將臨時變數封裝為棧幀壓入記憶體棧,等函式執行完成返回時,才出棧。系統棧或者虛擬機器棧空間一般都不大。如果遞迴求解的資料規模很大,呼叫層次很深,一直壓入棧,就會有堆疊溢位的風險。
2,重複計算,拖慢計算速度;
優化方面:
1,遞迴方式的優化:
$a = 1;$b = 1
;function fun($a, $b, $n)
return $a;
}
2,非遞迴方式:
function fun($n)$a = $b = 1
;
for($i=2; $i<$n; $i++)
return $b;
}
測試 n = 20 的時候的結果:
//遞迴未優化
值:6765
0.00088596343994141
遞迴次數:
13529
//遞迴優化
值:6765
4.0531158447266e-6
遞迴次數:
19//
非遞迴值:6765
3.0994415283203e-6
遞迴次數:
1
綜上所述,效能方面: 非遞迴 > 優化的遞迴 > 未優化後的遞迴
斐波那契數列 遞迴和遞迴優化
斐波那契數列 經典數學問題之一 斐波那契數列,又稱 分割數列,指的是這樣乙個數列 1 1 2 3 5 8 13 21 想必看到這個數列大家很容易的就推算出來後面好幾項的值,那麼到底有什麼規律,簡單說,就是前兩項的和是第三項的值,也許你會想到的是迭代,也學你想到的是遞迴。簡單分析一下遞迴 int fi...
斐波那契數列普通 遞迴和優化遞迴實現
斐波那契額數列,又稱為 分割數列,指的是這樣乙個數列 1 1 2 3 5 8 13 21 簡單來說就是前兩項的和是第三項的值。1 普通實現 迭代 include using namespace std intfibon int n return c int main 2 遞迴實現 include u...
遞迴優化 斐波那契
f n f n 1 f n 2 1,2,3,5,8.自頂向下使用的遞迴層次比較多,在n取值較大的情況下,效率很低 時間維度 所以可以使用陣列來替換多重遞迴呼叫,即以空間來置換時間 intersting include include include include include include d...