Python递归函数simulate_tournament为何需要额外添加return语句?
递归函数返回值逻辑问题解答
核心原因
Python中每一层函数的返回值只会传递给它的直接调用方,不会自动透传到最外层的调用入口。你删掉最后一行return后,深层递归返回的冠军队伍值无法被外层调用拿到,自然就无法正常运行。
执行流程拆解
我们先看你删除最后一行return teams[0]['team']后的代码:
def simulate_tournament(teams): if len(teams) == 1: return teams[0]['team'] else: teams = simulate_round(teams) simulate_tournament(teams)
假设传入4个队伍触发调用,执行流程如下:
- 第一层调用:队伍长度为4>1,走else分支,调用
simulate_round得到2支晋级队伍,接着触发第二层调用simulate_tournament(2支晋级队) - 第二层调用:队伍长度为2>1,走else分支,调用
simulate_round得到1支晋级队伍,接着触发第三层调用simulate_tournament(1支晋级队) - 第三层调用:队伍长度为1,直接返回冠军队伍名。但这个返回值只会传给第二层调用的触发位置,不会直接给到最外层调用者
- 回到第二层调用:你没有接收第三层返回的冠军值,也没有任何显式return语句,所以第二层调用默认返回
None,这个None只会传给第一层调用的触发位置 - 回到第一层调用:你同样没有接收第二层返回的
None,也没有显式return语句,所以第一层调用最终返回None,功能自然失效。
补充说明
你原来的写法其实存在冗余,正确的递归写法可以简化为下面的版本,不需要额外在if-else外写return语句:
def simulate_tournament(teams): if len(teams) == 1: return teams[0]['team'] teams = simulate_round(teams) # 直接把递归调用的结果返回给上一层调用者 return simulate_tournament(teams)
内容的提问来源于stack exchange,提问作者Terry Chung
相关产品推荐
相关产品推荐

