You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

递归函数逻辑错误排查:为何factorial(n-1)改factorial(--n)输出为0?

阶乘递归中替换n-1为--n导致输出0的原因

首先纠正一个概念错误:你提到的--x是前置递减运算符,后置递减运算符是x--,两者核心区别是前置会先修改变量值再使用,后置是先使用变量原始值再修改。

接下来分析替换后出现逻辑错误的原因:

原代码的执行逻辑

原代码中fact = n * factorial(n-1)的核心逻辑是:

  • n-1是临时表达式,不会修改当前函数栈中n的原始值
  • 乘法运算时使用当前n的原始值,仅将n-1的临时结果传递给递归函数

以计算factorial(3)为例:

  1. n=3满足n>=1,执行3 * factorial(2)
  2. 递归调用factorial(2),执行2 * factorial(1)
  3. 递归调用factorial(1),执行1 * factorial(0)
  4. factorial(0)返回1,回溯计算:1*1=1 → 2*1=2 → 3*2=6,结果正确

替换为--n后的执行逻辑

当把factorial(n-1)换成factorial(--n)后,--n会先修改当前函数的n值,再将修改后的值传递给递归函数,直接破坏了原本的计算逻辑:

同样以计算factorial(3)为例:

  1. n=3满足n>=1,先执行--n使n变为2,再调用factorial(2)
  2. 进入factorial(2),满足n>=1,执行--n使n变为1,调用factorial(1)
  3. 进入factorial(1),满足n>=1,执行--n使n变为0,调用factorial(0)
  4. factorial(0)返回1,回溯计算:
    • factorial(1)中n已经是0,所以fact = 0 * 1 = 0
    • factorial(2)中n已经是1,所以fact = 1 * 0 = 0
    • factorial(3)中n已经是2,所以fact = 2 * 0 = 0
  5. 最终返回0,出现逻辑错误

总结

  • n-1是只读表达式,不改变原变量,保证乘法时使用当前层级的原始n值
  • --n是修改变量的操作,会直接覆盖当前层级的n值,导致乘法运算使用了递减后的错误数值,最终整个递归链的结果都被错误地乘0,输出0

内容的提问来源于stack exchange,提问作者Samuel Adham

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.13 13:55:12