鍍金池/ 問(wèn)答/PHP  HTML/ 不改變內(nèi)存限制用遞歸實(shí)現(xiàn)斐波拉契

不改變內(nèi)存限制用遞歸實(shí)現(xiàn)斐波拉契

實(shí)現(xiàn)斐波拉契數(shù)列,在用php中用遞歸的時(shí)候會(huì)出現(xiàn)超過(guò)限制內(nèi)存的錯(cuò)誤提醒。
es6里面有尾遞歸優(yōu)化,php里面有什么優(yōu)化的方式么?

先貼兩種網(wǎng)上找到的解決方案,
第一種:http://blog.csdn.net/h3305319...
第二種:https://www.cnblogs.com/zhenb...
第一種利用高階函數(shù)回調(diào)方式經(jīng)過(guò)試驗(yàn)還是不可以,不過(guò)第二種方案在實(shí)現(xiàn)過(guò)程中還是可以滿足的。
如下圖:

clipboard.png

好的 那么問(wèn)題來(lái)了,
如何解決不改變內(nèi)存限制,利用遞歸實(shí)現(xiàn)?
第一種方案為何不行?
第二種為什么又可以了??

回答
編輯回答
解夏

//實(shí)現(xiàn)斐波拉契數(shù)列

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";
}
2017年5月27日 09:56
編輯回答
綰青絲

可以使用 yield 協(xié)程調(diào)用來(lái)實(shí)現(xiàn)

2018年2月15日 15:48
編輯回答
離人歸

第二種方案使用全局變量$cache作為緩存,所以再遞歸中每一個(gè)n對(duì)應(yīng)的值只計(jì)算一遍,事實(shí)上計(jì)算fib(x)只會(huì)調(diào)用x次函數(shù),可以在很快的時(shí)間和很小的棧空間使用下完成。

2017年9月27日 08:19