了解递归函数中总值的存储位置 - Python

car*_*ers 2 python recursion

我试图了解总值的存储位置,例如该函数的返回值是 int15。输入列表中的每个数字都会被取出,一次添加一个,然后从列表中删除,但我看不到临时值存储在哪里,我只能得到完整的总数?

另外关于return L[0] + mysum(L[1:])如果mysum(L[1:])存储列表如何添加L[0],如果mysum(L[1:])不存储列表,列表存储在哪里,它不会丢失,那么程序肯定不知道接下来要添加哪些数字?

代码

def mysum(L):
    print(L) # Trace recursive levels
    if not L: # L shorter at each level
        return 0
    else:
        return L[0] + mysum(L[1:])

total = mysum([1, 2, 3, 4, 5])

print("Total = ", total)
Run Code Online (Sandbox Code Playgroud)

返回

[1, 2, 3, 4, 5]
[2, 3, 4, 5]
[3, 4, 5]
[4, 5]
[5]
[]
Total =  15
Run Code Online (Sandbox Code Playgroud)

kay*_*ya3 5

中间运行总计永远不会“存储”在变量中 - 每次递归调用之一返回时,它们都会沿着调用堆栈传递:

  • 第一个递归调用 return 是mysum([])返回数字 0。
  • 此后,递归调用mysum([5])返回 5 + 0 = 5。
  • 此后递归调用mysum([4,5])返回 4 + 5 = 9。
  • 然后递归调用mysum([3,4,5])返回 3 + 9 = 12。
  • 然后mysum([2,3,4,5])返回 2 + 12 = 14。
  • 最后,原始非递归调用mysum([1,2,3,4,5])返回 1 + 14 = 15。

我有一个交互式演示,它展示了如何使用调用堆栈逐步计算一些递归函数。它可以帮助您了解递归函数是如何执行的。