递归实现simulate_tournament函数报错,循环版本正常的原因解析
递归实现
simulate_tournament时出现TypeError: string indices must be integers的原因分析 先看你提供的两段代码示例
报错的递归版本(示意)
def simulate_tournament(teams): if len(teams) == 1: return teams[0]["team"] # 错误示例:递归时传入了单个字典甚至字符串,而非字典列表 winner = simulate_tournament(teams[0]) return winner
正常运行的while循环版本(示意)
def simulate_tournament(teams): while len(teams) > 1: new_teams = [] for i in range(0, len(teams), 2): team1 = teams[i] team2 = teams[i+1] winner = team1 if team1["rating"] > team2["rating"] else team2 new_teams.append(winner) teams = new_teams return teams[0]["team"]
报错的核心原因
递归版本里,你在某一层递归调用时,传入的参数不是「包含字典的列表」,而是单个字符串或者单个字典。
举个具体的错误场景:如果你的递归逻辑里,误把某个字典的"team"值(字符串类型)当成参数传入下一层递归,那下一层函数的teams变量就变成了字符串。这时候执行teams[0]["team"],首先teams[0]是字符串的第一个字符,再用["team"]去索引就会触发TypeError——因为字符串只能用整数做索引,不能用字符串。
而while循环版本里,你全程保证teams是「包含字典的列表」:每次循环都生成新的字典列表,直到最后剩下一个字典,再取出它的"team"值,自然不会触发类型错误。
修复递归版本的正确思路
要让递归正常工作,必须确保每一层递归传入的参数都是「包含字典的列表」,不能传单个字符串或字典。比如修正后的递归代码应该是这样:
def simulate_tournament(teams): if len(teams) == 1: return teams[0]["team"] # 先生成下一轮的获胜者字典列表 new_teams = [] for i in range(0, len(teams), 2): team1 = teams[i] team2 = teams[i+1] winner = team1 if team1["rating"] > team2["rating"] else team2 new_teams.append(winner) # 递归传入新的字典列表 return simulate_tournament(new_teams)
这样每一层递归的teams都是字典列表,终止条件时取出单个字典的"team"值,就不会再报错了。
内容的提问来源于stack exchange,提问作者user19775552
相关产品推荐
相关产品推荐

