定義通り再帰で実装すると、非常に非効率になることで知られる(ゆえにベンチマーク用に使われたりする)フィボナッチ数列計算ですが、イテレータで解いてみるテスト。
<?php
class Fib implements Iterator
{
private $prevprev = -1, $prev = 1, $i = 0, $k = 0;
function key() { return $this->k; }
function current() { return $this->i = $this->prevprev + $this->prev; }
function next() {
$this->prevprev = $this->prev;
$this->prev = $this->i;
++$this->k;
}
function rewind() {
$this->prevprev = -1;
$this->prev = 1;
$this->k = 0;
}
function valid() { return true; }
}
$fib = new Fib;
foreach ($fib as $i => $v) {
echo "$i\t$v\n";
usleep(50000);
} //無限ループ
フィボナッチで各種言語をベンチマーク - satosystemsの日記
fib(38)が欲しいなら、LimitIteratorの合わせ技で求められるよ!
$fib38 = new LimitIterator(new Fib, 0, 38 + 1);
foreach ($fib38 as $_);
echo $_;