带有递归调用的return语句如何在Python中保存中间值?
问题内容:
正在审查与递归调用相关的一些python代码,并注意到return语句看起来很有趣。当下一个递归调用的return语句中没有变量赋值时,递归如何工作?
在进行递归调用时,中间求和值没有存储在明显的位置。调试器似乎显示列表每次调用减少一个,但是我只是不明白中间值存储在哪里。
另一个有趣的事情是,调试器似乎在进行了最后一次调用后,将值遍历了最后一次。使用PyCharm,但不确定是否重要。
在随后的递归中,return语句如何在递归调用期间保存求和的值?
def sum_list(list_of_num):
if len(list_of_num) == 1:
return list_of_num[0]
else:
return list_of_num[0] + sum_list(list_of_num[1:])
print(sum_list([4,6,7,3,7,3,2]))
问题答案:
该函数将值返回到调用堆栈中较高的调用,为什么您认为它需要一个变量,例如进行简单的递归调用:
def r(n):
if n == 0:
return 0
return 1 + r(n-1)
然后,调用堆栈将如下所示:
r(3):
return 1 + r(2)
r(2):
return 1 + r(1)
r(1):
return 1 + r(0)
r(0):
return 0
因此,当展开调用堆栈时,您将得到:
r(3):
return 1 + r(2)
r(2):
return 1 + r(1)
r(1):
return 1 + 0
--
r(3):
return 1 + r(2)
r(2):
return 1 + 1
--
r(3):
return 1 + 2
--
3