php递归阶乘核心逻辑是:当$n===0或$n===1时返回1作为终止条件,否则返回$n*factorial($n-1);必须校验输入为非负整数并限制深度(如n>200抛异常),否则易触发嵌套层级超限错误。

PHP7 递归函数怎么写阶乘
直接上核心逻辑:阶乘递归必须有明确的终止条件,否则会无限调用导致 Maximum function nesting level of '256' reached 错误。PHP7 默认 xdebug.max_nesting_level 是 256,而 factorial(1000) 就会爆掉。
正确写法是让 n === 0 或 n === 1 时返回 1,其余情况返回 n * factorial(n - 1):
function factorial($n) {
if ($n
- 必须检查负数输入,否则递归永不终止(
factorial(-1)→-1 * factorial(-2)→ …) - 用
===而非==,避免类型隐式转换干扰判断(比如传入字符串"1") - PHP7 支持整型严格校验,但不会自动拒绝超大整数;
factorial(100)返回的是浮点近似值,已失真
为什么 factorial(100) 在 PHP7 里结果不对
PHP 的 int 类型有平台限制(32 位系统最大约 21 亿,64 位约 9.2e18),而 100! ≈ 9.3e157,远超整型范围。PHP7 会自动转成 float,但 float 只能精确表示最多约 15 位十进制数字,高位精度丢失不可避免。
- 运行
var_dump(factorial(20))还是整数,但var_dump(factorial(23))开始变成float - 想算大数阶乘,得换方案:用
bcmul()+ 字符串模拟,或引入gmp_fact()(需启用 GMP 扩展) - 别信网上“PHP7 支持大整数”这种说法——它只是支持
int更大范围,不是任意精度
递归阶乘在 PHP7 里性能差在哪
每次调用都压栈、保存局部变量、跳转,开销比循环高得多。实测 factorial(500) 比等效的 for 循环慢 3–4 倍,且内存占用线性增长。
- PHP7 不支持尾递归优化(Tail Call Optimization),所以
return factorial(n-1)无法被编译器转成跳转指令 - 如果只是教学或小数值(
n ≤ 20),递归写法清晰易懂;生产环境建议改用迭代 - 想强行用递归又怕栈溢出?加个深度防护:
if ($n > 200) throw new RuntimeException('Too deep');
测试和调试递归阶乘常见报错
最常遇到三个错误,对应三种典型误操作:
-
Uncaught Error: Maximum function nesting level of '256' reached:忘了终止条件,或终止条件写成$n == 2导致factorial(3)→3 * factorial(2)→3 * 2 * factorial(1)→ 却没拦截1,继续算factorial(0)、factorial(-1)… -
Warning: A non-numeric value encountered:传了空字符串、null或数组进去,PHP7 严格模式下null * 5会告警 -
Fatal error: Uncaught TypeError: Argument 1 passed to factorial() must be of the type int, string given:函数声明写了function factorial(int $n),但传了"5"—— PHP7 默认不开启严格类型检查,加了declare(strict_types=1);才会报这个错
递归本身不难,难的是边界控制和数据类型意识。PHP7 的类型提示和错误机制比老版本更敏感,写之前先想清楚:谁调用你?传进来的东西真的总是整数吗?
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











