我有一个代码,它打印1:

s = 0

def dfs(n):
    global s
    if n > 10:
        return 0
    s += dfs(n + 1)
    return n

dfs(0)
print(s)

如果我这样修改dfs:

def dfs(n):
    global s
    if n > 10:
        return 0
    i = dfs(n + 1)
    s += i
    return n

它将打印55

我知道什么是更好的方式来写dfs.我只是想知道为什么两个dfs的调用后s的值不同

推荐答案

Python是从上到下解释和执行的,所以在第一个版本中,你有:

s += dfs(n + 1)

确切地说:

s = s + dfs(n + 1)

因此,当你递归地执行这个操作时,你会有堆栈这些命令:

s = 0 + dfs(1) # <-- dfs(1) will return 1
s = 0 + dfs(2) # <-- dfs(2) will return 2
...
s = 0 + dfs(9) # <-- dfs(9) will return 9
s = 0 + dfs(10) # <-- dfs(10) will return 10
s = 0 + dfs(11) # <-- dfs(11) will return 0

所以当你观察的时候,最后一步是s = 0 + 1,你会看到1是最终的结果.


第二版本

i = dfs(n + 1)
s += i

在判断dfs(n + 1)后,你将分配给s,所以你会看到最终答案55


注意:如果你把第一个版本s += dfs(n + 1)重写为s = dfs(n + 1) + s,你也会看到结果55.

Python相关问答推荐

当密钥是复合且唯一时,Pandas合并抱怨标签不唯一

Pandas 第二小值有条件

滚动和,句号来自Pandas列

PywinAuto在Windows 11上引发了Memory错误,但在Windows 10上未引发

Python 约束无法解决n皇后之谜

如何让Flask 中的请求标签发挥作用

如何请求使用Python将文件下载到带有登录名的门户网站?

如何调整QscrollArea以正确显示内部正在变化的Qgridlayout?

将9个3x3矩阵按特定顺序排列成9x9矩阵

Pre—Commit MyPy无法禁用非错误消息

SQLAlchemy Like ALL ORM analog

Pandas计数符合某些条件的特定列的数量

如何在Polars中从列表中的所有 struct 中 Select 字段?

Pandas Loc Select 到NaN和值列表

启用/禁用shiny 的自动重新加载

剪切间隔以添加特定日期

使用tqdm的进度条

我可以不带视频系统的pygame,只用于游戏手柄输入吗?''

按条件计算将记录拆分成两条记录

大型稀疏CSR二进制矩阵乘法结果中的错误