PHP递归算阶乘易爆内存,因默认栈深度有限,factorial(1000)会触发内存耗尽或嵌套层级超限;应改用迭代实现,避免递归风险。
PHP递归算阶乘直接爆内存?别用递归
PHP默认栈深度有限,factorial(1000) 这种递归写法会快速触发“Allowed memory size exhausted”或“Maximum function nesting level reached”。这不是内存配得不够,是递归本身在PHP里就是高危操作。
改用迭代是最直接的解法:
function factorial($n) {
if ($n < 0) return false;
$result = 1;
for ($i = 2; $i <= $n; $i++) {
$result *= $i;
}
return $result;
}
- 避免函数调用栈累积,内存占用恒定(O(1))
- 支持到
$n ≈ 10^5都没问题(瓶颈转为整数溢出或字符串精度) - 若需超大数(如
factorial(10000)),必须用bcmul+ 字符串模拟,不能依赖原生int
php.ini里开大memory_limit没用?因为不是内存问题
看到“memory exhausted”就去改 memory_limit 是常见误区。递归爆的是**栈空间**,不是堆内存;memory_limit 管的是堆,对栈深度完全无效。
真正相关的是:
立即学习“PHP免费学习笔记(深入)”;