递归函数逻辑错误排查:为何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)为例:
n=3满足n>=1,执行3 * factorial(2)- 递归调用
factorial(2),执行2 * factorial(1) - 递归调用
factorial(1),执行1 * factorial(0) factorial(0)返回1,回溯计算:1*1=1→2*1=2→3*2=6,结果正确
替换为--n后的执行逻辑
当把factorial(n-1)换成factorial(--n)后,--n会先修改当前函数的n值,再将修改后的值传递给递归函数,直接破坏了原本的计算逻辑:
同样以计算factorial(3)为例:
n=3满足n>=1,先执行--n使n变为2,再调用factorial(2)- 进入
factorial(2),满足n>=1,执行--n使n变为1,调用factorial(1) - 进入
factorial(1),满足n>=1,执行--n使n变为0,调用factorial(0) factorial(0)返回1,回溯计算:factorial(1)中n已经是0,所以fact = 0 * 1 = 0factorial(2)中n已经是1,所以fact = 1 * 0 = 0factorial(3)中n已经是2,所以fact = 2 * 0 = 0
- 最终返回0,出现逻辑错误
总结
n-1是只读表达式,不改变原变量,保证乘法时使用当前层级的原始n值--n是修改变量的操作,会直接覆盖当前层级的n值,导致乘法运算使用了递减后的错误数值,最终整个递归链的结果都被错误地乘0,输出0
内容的提问来源于stack exchange,提问作者Samuel Adham
相关产品推荐
相关产品推荐

