递归函数调用时传入++参数与参数+1返回结果不同的原因
差异核心原因是两个表达式的行为本质不同
1. ++multiplier 是带副作用的变量修改操作
前置自增运算符++会直接修改当前函数作用域内multiplier变量本身的存储值,执行逻辑是:
- 先把当前
multiplier的数值加1 - 再返回加1后的结果作为表达式的值
你把它作为递归入参的时候,传值的同时已经把当前层的multiplier改掉了,子递归执行完回到当前层时,multiplier已经是加1后的值,不会自动恢复,后续循环、最终返回乘系数的时候用的都是被修改后的值,自然会计算错误。你手动加--multiplier能修复的本质就是把被意外修改的multiplier改回原值。
2. multiplier + 1 是无副作用的数值计算操作
加法表达式只会基于multiplier的当前值计算出一个新的数值,完全不会修改当前作用域内multiplier本身的存储值。你把计算出来的新值传给子递归,当前层的multiplier始终保持原来的数值,子递归返回后当前层的逻辑不受任何影响,自然不需要手动恢复。
举个简单的示例对比:
// 前置自增场景 let a = 1; console.log(++a); // 输出2 console.log(a); // 输出2,变量本身被修改 // 加法表达式场景 let b = 1; console.log(b + 1); // 输出2 console.log(b); // 输出1,变量本身没有变化
内容的提问来源于stack exchange,提问作者povigard
相关产品推荐
相关产品推荐

