1. 程式人生 > >php 兩種方式實現求 斐波那契數

php 兩種方式實現求 斐波那契數

機器 XP 方式 一個 urn 性能 耗時 exec [1]

  1. 使用遞歸方式。
     //使用遞歸方式求斐波那契數
        public function fb($n){  //
            if( $n <=2){
                return 1;
            }else{
                return fb($n-1) + fb($n-2);
            }
        }

  2. 使用遞推方式。
        //使用遞推方式求斐波那契數
        public function fb2($n){  //
            if( $n <=2){
                return 1;
            }
    
            $t1
    = 1;$t2 = 1; for($i=3;$i<$n;$i++){ $temp = $t1; $t1 = $t2; $t2 = $temp + $t2; } return $t1 + $t2; }


    最後,進行性能分析。
    明顯的可以預測,遞歸方法,每多一層,就要向下遞歸兩次。 約為 O(2 的N次方) 而遞推算法為 O(n),實測代碼如下。

    /**性能調整。*/
    function bench_profile($starttime , $flag = ‘‘){
        
    $endtime = explode(‘ ‘,microtime()); $thistime = $endtime[0]+$endtime[1]-($starttime[0]+$starttime[1]); $thistime = round($thistime,3); return $flag."-bench:".$thistime." sec"; } //使用遞歸算法。 ini_set("max_execution_time" ,3600); $s = explode(‘ ‘,microtime()); echo bench_profile($s
    )."<br/>"; echo fb(35); //使用遞歸 耗時 40.925 sec 每往上一個數約慢兩倍 echo bench_profile($s )."<br/>"; $s = explode(‘ ‘,microtime()); echo bench_profile($s )."<br/>"; echo fb2(35); //使用遞推 時間極短。 echo bench_profile($s )."<br/>";

    總結:代碼的性能是區別程序員入門和未入門的一把好鑰匙。
    使用遞歸算法,到求第100 個斐波那契數 時會卡到機器跑不動,而使用遞推算法,幾乎不費時間。

php 兩種方式實現求 斐波那契數