不改变内存限制用递归实现斐波拉契

实现斐波拉契数列,在用php中用递归的时候会出现超过限制内存的错误提醒。
es6里面有尾递归优化,php里面有什么优化的方式么?

先贴两种网上找到的解决方案,
第一种:http://blog.csdn.net/h3305319...
第二种:https://www.cnblogs.com/zhenb...
第一种利用高阶函数回调方式经过试验还是不可以,不过第二种方案在实现过程中还是可以满足的。
如下图:

clipboard.png

好的 那么问题来了,
如何解决不改变内存限制,利用递归实现?
第一种方案为何不行?
第二种为什么又可以了??

阅读 2.6k
3 个回答

第二种方案使用全局变量$cache作为缓存,所以再递归中每一个n对应的值只计算一遍,事实上计算fib(x)只会调用x次函数,可以在很快的时间和很小的栈空间使用下完成。

可以使用 yield 协程调用来实现

新手上路,请多包涵

//实现斐波拉契数列

function flist($limit){
    $pre1 = 1;
    $pre2 = 1;
    for ($i=0; $i <$limit ; $i++) {
        if($i<2){
            yield 1;
            continue;
        }
        $now = $pre2+$pre1;
        $pre2 = $pre1;
        $pre1 = $now;
        yield $now;
    }
}

$flist = flist(10);
foreach ($flist as $key => $value)
{
    echo $value . "\n";
}
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题