下面分别是用迭代器实现斐波那契数列和用递归回调实现的代码
<?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;
下面来看看实际时间对比
显然数组的效率比前两种都高很多