問題
斐波那契數列的計算:有如下一個數列:1,1, 2, 3, 5, 8, 13, 21,……. 其規則是:前兩個已知(即1和2),從第3個開始,其值為其左邊兩個值的和(此數列稱為斐波那契數列)。定義一個函式,該函式可以求出該數列的任意第n個數的值。
遞迴思想來解決:
- 遞迴的本質:函式在其內部呼叫自身
- 解決問題時可以將其分拆成若干個小步驟,大問題的解決方法與小步驟方法一致,定義求問題的函式,在需要的位置呼叫函式即可。
function fibonacci($n){
//找出口:什麼時候結束遞迴的呼叫
if($n==! || $n==2) return 1;
//計算其他項
//找入口:什麼時候開始遞迴呼叫
return fibonacci($n-1)+fibonacci($n-2);
/**思考
*return是否可以使用echo替換
*不可以,因為return 結束函式的呼叫
*需要返會給下次遞迴呼叫使用
**/
}
$start=microtime(true);//開始計時
echo fibonacci(35);
$end=microtime(true);//函式呼叫結束在計時
echo `計算耗時`.($end-$start).`秒`;//4.9秒
//遞迴每次呼叫時,沒有立即結束函式的呼叫,記憶體沒有釋放,等到後面計算出結果,才從後面開始釋放記憶體
思考問題:
1.遞迴:
- 找入口:
- 找出口:
2.return是否可以使用echo替換
- 不可以 return結束函式的呼叫
- 需要返回給下次遞迴呼叫使用
迭代思想來解決
function fibonacci($n){
if($n==1 ||$n==2) return 1;
//其他項
//第三項-->
//假設求第七項,從第三項考試逐個計算
//本次計算作為下次計算的條件使用
//定義初始條件
//前兩項作為基本條件
$first=1;
$secont=2;
for($i=3;$i<=$n;$i++){
//之間兩項之和
$res=$first+$second;
//為後續計算做準備
//下次計算的第一項來自本次計算計算的第二項
$first=$second;
//下次計算的第二項來自本次計算的結果
$second=$res;
}
//迴圈結束 得到結果
return $res;
}
$start=microtime(true);
echo fibonacci(135);
$end=microtime(true);
echo `計算耗時:`.($end-$start);//4.315秒,比遞迴效率高几千萬倍
結論:迭代的執行效率比遞迴高很多,能用迭代解決就別用遞迴,也就是說先考慮迭代再考慮遞迴。