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