用for循环实现阶乘最直观:初始化$result=1,若$n为0则结果为1,否则从1到$n依次累乘,清晰体现n!=1×2×…×n的连乘本质。

用 for 循环写阶乘最直观,适合新手理解流程
阶乘本质是连乘:n! = 1 × 2 × 3 × … × n。用 for 循环能清晰看到每一步怎么累乘。
- 初始化一个变量(比如
$result = 1),不能是 0,否则整个结果永远为 0 - 循环从 1 到
$n(含),每次把$i乘到$result上 - 注意处理边界:0! = 1,所以得单独判断
$n === 0的情况
$n = 5;
$result = 1;
if ($n === 0) {
$result = 1;
} else {
for ($i = 1; $i <= $n; $i++) {
$result *= $i;
}
}
echo $result; // 输出 120
while 实现阶乘更强调条件控制,容易漏掉自增
和 for 逻辑一致,但把初始化、条件、迭代拆开了,新手容易忘记写 $i++,导致死循环。
- 必须在循环体内显式更新计数器,比如
$i++ - 条件判断建议用
$i ,而不是$i ——后者可读性差,还可能因类型转换出错 - 如果输入是负数,
while不会自动报错,得自己加if ($n
递归写法简洁但有实际限制,别在生产环境直接套用
数学定义就是递归的:n! = n × (n−1)!,代码看着很像公式,但 PHP 默认栈深度有限(通常 100 层左右)。
- 超过约 100 就会触发
Fatal error: Maximum function nesting level of '100' reached - 每次调用都压栈,内存开销比循环大,且无法中断或调试中间值
- 如果真要用,至少加个保护:
if ($n > 100 || $n
function factorial($n) {
if ($n < 0) return false;
if ($n === 0 || $n === 1) return 1;
return $n * factorial($n - 1);
}大数阶乘会溢出,int 装不下就该换方案
PHP 的 int 在 64 位系统上最大约 9E18,factorial(21) 就超了,结果变负数或科学计数法(已失真)。
立即学习“PHP免费学习笔记(深入)”;
- 别依赖
var_dump看输出是否“像数字”——要检查is_int($result)和实际精度 - 真正需要大数时,用
bcmul配合字符串运算(需启用 bcmath 扩展) - 简单验证:运行
echo PHP_INT_MAX;,再算factorial(20)和factorial(21)对比输出
新手起步用 for 循环足够,重点是搞清乘法累积过程和边界处理;一旦数值变大或逻辑嵌套加深,就得立刻意识到类型和规模的限制。











