You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

递归中Python全局变量为何产生不同执行结果?

两段递归代码中全局变量s取值不同的原因分析

你描述的输出结果(第一段输出1,第二段输出55)与给出的代码逻辑存在矛盾——你提供的两段代码里,s += dfs(n+1)和i=dfs(n+1); s +=i是完全等价的逻辑,理论上输出应该一致。结合输出反推,第一段代码大概率是将s += dfs(n+1)误写为了s = dfs(n+1),以下基于此合理假设分析差异:

第一段代码(实际为赋值操作)

s = 0

def dfs(n):
    global s
    if n > 10:
        return 0
    s = dfs(n + 1)  # 赋值而非累加
    return n

dfs(0)
print(s)

执行流程

递归调用会先逐层深入到n=11,返回0后开始回溯:

  • n=10:s = dfs(11) → s=0,返回10
  • n=9:s = dfs(10) → s=10,返回9
  • n=8:s = dfs(9) → s=9,返回8
  • ...
  • n=1:s = dfs(2) → s=2,返回1
  • n=0:s = dfs(1) → s=1,返回0

最终全局变量s被最后一次赋值操作覆盖为1,所以输出1。

第二段代码(累加操作)

s = 0

def dfs(n):
    global s
    if n > 10:
        return 0
    i = dfs(n + 1)
    s += i  # 累加子递归返回值
    return n

dfs(0)
print(s)

执行流程

同样先深入到n=11返回0,回溯时每一层都会将子递归的返回值累加到s:

  • n=10:i=0,s +=0 → s=0,返回10
  • n=9:i=10,s +=10 → s=10,返回9
  • n=8:i=9,s +=9 → s=19,返回8
  • ...
  • n=0:i=1,s +=1 → s=10+9+8+...+1=55,返回0

最终s是1到10的累加和55,所以输出55。

核心差异

两段代码的本质区别在于对全局变量s的操作类型:

  • 赋值操作会覆盖之前的s值,仅保留最后一次赋值结果;
  • 累加操作会持续将子递归的返回值叠加,最终得到所有返回值的总和。

内容的提问来源于stack exchange,提问作者ValueError

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.27 01:07:05