python - 了解总值存储在递归函数中的位置 - Python
问题描述
我试图了解总值的存储位置,例如此函数的返回是 int 15
。输入列表中的每个数字都被取出并一次添加一个并从列表中删除,但我看不到临时值的存储位置我只能得到完整的总数?
另外关于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)
返回
[1, 2, 3, 4, 5]
[2, 3, 4, 5]
[3, 4, 5]
[4, 5]
[5]
[]
Total = 15
解决方案
中间运行总数永远不会“存储”在变量中 - 每次递归调用之一返回时,它们都会向下传递到调用堆栈:
- 返回的第一个递归调用是
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。
我有一个交互式演示,它展示了如何使用调用堆栈逐步计算一些递归函数。它可以帮助您了解递归函数是如何执行的。
推荐阅读
- python - numpy/scipy 等效于 MATLAB 的 SYMAMD 函数
- canvas - 删除单点悬停时的彩色框,并显示多个点何时与图表 Js 相交
- java - JDBC 驱动程序连接需要什么权限?
- azure - 如何在 Azure DevOps 中更改自定义版本名称?
- node.js - 为 Dialogflow Webhooks 编写更好的代码
- javascript - 只显示悬停
在 Vuetify 数据表中 - reactjs - Jest 和 Enzyme 的问题
- javascript - 什么 JavaScript 会将 PDF 中的元数据转换为 Acrobat Dynamic Stamp 计算?
- protractor - 反应选择下拉菜单没有用量角器点击
- r - 如何在R中获取闭包的参数数量