php实现斐波那契数列的三种方法,递归回调和迭代器和数组之间性能对比

下面分别是用迭代器实现斐波那契数列和用递归回调实现的代码

<?php
class fibonacci implements Iterator{
        private $key=0;
        private $value=array(0=>0,1=>1);
        public function __construct(){
            $this->key=0;
        }
        public function rewind(){
            $this->key++;
        }
        public function key(){
            return $this->key;
        }
        public function current(){
            return $this->value[$this->key];
        }
        public function next(){
            $this->value[++$this->key]=$this->value[$this->key-2]+$this->value[$this->key-1];
            return true;
        }
        public function valid(){
            return isset($this->value[$this->key]);
        }
    }

    $starttime=microtime();
    $fibonacci=new fibonacci(); 
    foreach ($fibonacci as $key => $value) {
        if($key==100){
            echo $value."<BR>";
            break;
        }
    }
    $endtime=microtime();
    echo $endtime-$starttime;
    echo "<BR>";


    function fibonacci2($n,$a=1,$beforebefore=0,$before=1){
        if($n==$a)
            return $before;
        return function()use($n,$a,$beforebefore,$before){
            return fibonacci2($n,++$a,$before,$before+$beforebefore);
        };
    }
    function trampoline($callback,$param){
        $result=call_user_func_array($callback,$param);
        while(is_callable($result)){
            $result=$result();
        }
        return $result;
    }
    $starttime=microtime();
    echo trampoline('fibonacci2',array(100))."<BR>";
    $endtime=microtime();
    echo $endtime-$starttime;
    ?>
而在浏览器中测试效果是这样的:

可以看到递归回调所花的时间是0.005662
迭代器实现所花的时间是0.009785
从这我们可以看出显然递归回调所花的时间更少,性能更好,但是其中的原理仍在探讨中.....
但是实际上效率最高的是用数组,这个刷过题的应该都知道吧
$starttime=microtime();
    $arr[0]=0;
    $arr[1] = 1;
    for($i = 2;$i <= 100;$i++)
    {
        $arr[$i] = $arr[$i-1] + $arr[$i-2];
    }
    echo $arr[100]."<BR>";
    $endtime=microtime();
    echo $endtime-$starttime;
下面来看看实际时间对比
显然数组的效率比前两种都高很多


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章