<?php
// 優化前
function fb($len) {
if ($len < 3) return 1;
return fb($len - 2) + fb($len-1);
}
// 優化以后
function fb($len) {
static $cache = [];
if ($len < 3) return 1;
if (key_exists($len, $cache)) {
return $cache[$len];
} else {
$fb = fb($len - 2) + fb($len-1);
$cache[$len] = $fb;
return $fb;
}
}
主要原因:在遞歸調用時出現了大量的重復計算,故可以將單次遞歸結果保存在一個變量中,每次遞歸時查詢是否存在,存在即返回
<?php
function fb2($n=1, $a =1, $b=1){
if ($n > 2) {
// 存儲前置變量
return fb2($n-1, $a+$b, $a);
}
return $a;
}
var_dump(fb2(3));
