對遞歸和迭代的效率的思考和分析

問題

斐波那契數列的計算:有以下一個數列: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.遞歸:php

  • 找入口:
  • 找出口:

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秒,比遞歸效率高几千萬倍

結論:迭代的運行效率比遞歸高不少,能用迭代解決就別用遞歸,也就是說先考慮迭代再考慮遞歸。code

相關文章
相關標籤/搜索