递归函数summation后半段输出执行原理咨询
递归函数
summation执行流程后半段的通俗解释 首先看原代码:
def summation(lower, upper, margin): (1) blanks = " " * margin (2) print(blanks, lower, upper) (3) if lower > upper: (5) print(blanks, 0) (6) return 0 else: result = lower + summation(lower + 1, upper, margin + 4) (4) print('*', blanks, result) (7) return result
调用summation(1, 4, 0)的输出:
# Output: 1 4 (from step 3) 2 4 (from step 3) 3 4 (from step 3) 4 4 (from step 3) 5 4 (from step 3) 0 4 <=== How could the function "know" to calculate the `blanks` and the `result`? 7 <=== ??? 9 <=== ??? 10 <=== ??? 10
核心逻辑:递归的「任务栈」——每个调用都是独立的“待完成工单”
你可以把每个summation调用看成一张带着专属参数的工单,这些工单会按顺序“叠”起来:
- 第一张工单(
lower=1, upper=4, margin=0)执行到步骤(4)时,发现得先让下一张工单(lower=2, upper=4, margin=4)做完,于是它暂停在步骤(4),把自己的状态(已经算好的blanks、当前lower值等)存在“栈”里,等着下一张工单的结果。 - 第二张工单重复这个操作,调用第三张,直到最后一张工单(
lower=5, upper=4, margin=16)触发lower>upper的条件,执行步骤(6)返回0。
现在最底层的工单完成了,开始往回“结算”:
- 倒数第二张工单(
lower=4, upper=4, margin=12)之前暂停在步骤(4),现在拿到返回的0,算出result=4+0=4,然后执行步骤(7)——它的blanks是步骤(2)早就算好的" " *12,所以打印出4,完成后返回4给上一张工单。 - 上一张工单(
lower=3, upper=4, margin=8)拿到4,算出3+4=7,用自己的blanks(" "*8)执行步骤(7),打印7,返回7。 - 接着是
lower=2的工单,拿到7后算2+7=9,用margin=4对应的空格打印9,返回9。 - 最后是第一张工单(
lower=1),拿到9后算1+9=10,用margin=0的空格打印10,最终返回10。
为啥每个调用都能拿到正确的blanks和result?
每个工单在执行步骤(2)时,就已经根据自己的margin算出了专属的blanks,这个值会存在自己的状态里,哪怕暂停也不会丢。而result是用自己的lower加上下一个工单返回的结果计算的,每个工单只需要等下一层的结果,就能完成剩余步骤。
简单说:每个递归调用都是独立的个体,各自保存着自己的参数和中间值,等底层调用返回后,上层调用就能从暂停的地方继续执行,用自己保存的数据完成后续操作。
内容的提问来源于stack exchange,提问作者Nemo
相关产品推荐
相关产品推荐

