下面分別是用迭代器實現斐波那契數列和用遞歸回調實現的代碼
<?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;
下面來看看實際時間對比
顯然數組的效率比前兩種都高很多