递归函数sumRange执行流程解析:为何返回6?
递归函数sumRange(3)的执行全解析
首先看完整代码:
sumRange(3); function sumRange(num){ if(num === 1) return 1; return num + sumRange(num-1); }
一、逐步拆解执行过程(为什么最终返回6)
递归就像剥洋葱,先一层层“往里剥”(发起调用),再一层层“往外算”(返回结果):
- 第一步调用
sumRange(3):此时num=3,不满足num===1的终止条件,要执行return 3 + sumRange(2)——但加法此时算不了,因为sumRange(2)的结果还没出来,这个调用先被“挂起来”。 - 第二步调用
sumRange(2):num=2也不满足终止条件,执行return 2 + sumRange(1),同样加法无法完成,继续挂起这个调用。 - 第三步调用
sumRange(1):num=1触发终止条件,直接返回1——这是第一个确定的结果,递归开始往回走。 - 回到
sumRange(2)的挂起调用:拿到sumRange(1)的结果1,计算2+1=3,返回3。 - 回到最开始的
sumRange(3):拿到sumRange(2)的结果3,计算3+3=6,最终返回6。
二、加法操作的时机和位置
加法是在递归调用返回结果之后才执行的:
- 每一层递归调用只会先“记住”要做
num + 下一层结果这个操作,但必须等下一层递归完成计算并返回值,当前层的加法才能落地。 - 比如
sumRange(3)的加法要等sumRange(2)返回3才会算;sumRange(2)的加法要等sumRange(1)返回1才会算,加法都发生在每一层递归的返回阶段。
三、需要牢记调用栈规则吗?
不需要死记硬背规则,但要理解调用栈的逻辑:
- 每次递归调用都会被放到调用栈的“顶部”,直到触发终止条件开始返回,栈里的调用才会从顶部开始依次弹出并完成计算。
- 你可以把它想象成叠书:要拿最下面的书,得先把上面的一本本拿下来。理解这个“先压栈、再弹栈计算”的逻辑,比背规则有用得多。
四、新手怎么掌握递归?
- 先抓终止条件:这是递归的“锚点”,没有终止条件就会无限递归崩溃。比如这个例子里
num===1返回1,就是明确的停止信号。 - 把递归函数当黑箱:写
sumRange(num)时,假设sumRange(num-1)已经能正确算出1到num-1的和,你只需要做num + 这个黑箱的结果就行,不用纠结黑箱内部怎么跑。 - 手动拆解小例子:别一开始就看复杂递归,像这次的sumRange(3),把每一步的调用和返回都写在纸上,一步步捋清楚,不跳过任何环节。
- 从简单问题练手:先写计算阶乘、数组求和、求最大公约数这类简单递归,多写几次,慢慢建立递归的“感觉”。
内容的提问来源于stack exchange,提问作者Mr. Lo
相关产品推荐
相关产品推荐

