<?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));