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

递归实现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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 07:20:53