递归中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,返回10n=9:s = dfs(10)→ s=10,返回9n=8:s = dfs(9)→ s=9,返回8- ...
n=1:s = dfs(2)→ s=2,返回1n=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,返回10n=9:i=10,s +=10→ s=10,返回9n=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
相关产品推荐
相关产品推荐

