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

Python环形游戏退出顺序函数实现问题求助(输入7时结果不符)

约瑟夫环问题代码修正

你的代码逻辑只是简单将原列表的偶数索引元素(从0开始计数)先加入结果,再追加奇数索引元素,这完全不符合“围成一圈每隔一名玩家退出”的规则,所以当n=7时出现了3和5的顺序错误。

这是经典的约瑟夫环问题(步长为2),需要模拟玩家围成圈的动态淘汰过程:每次从当前位置开始数2个玩家,移除第2个玩家并加入结果列表,直到圈内没有玩家为止。

修正后的代码

def create(n):
    players = list(range(1, n+1))
    result = []
    current = 0  # 记录下一轮开始计数的位置
    while players:
        # 计算要移除的玩家索引:从current开始数2个,即移动1步
        current = (current + 1) % len(players)
        # 移除该玩家并加入结果
        result.append(players.pop(current))
    return result


if __name__ == "__main__":
    print(create(1))  # [1]
    print(create(3))  # [2,1,3]
    print(create(7))  # [2,4,6,1,5,3,7]

代码说明

  • 用players列表模拟当前圈内剩余的玩家
  • current变量记录下一轮开始计数的起始位置
  • 每次循环计算要移除的玩家索引:(current + 1) % len(players),取模操作保证索引在列表范围内,模拟“围成圈”的特性
  • 移除玩家后,current自动成为下一轮的起始位置(因为列表元素前移,下一次从当前索引开始计数即可)

原代码错误原因

原代码没有模拟动态淘汰的循环过程,只是静态拆分原列表。当第一轮淘汰2、4、6后,剩余的1、3、5、7需要重新围成圈继续淘汰,而不是直接按原列表的顺序追加,这就导致了后续元素的顺序错误。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.01 12:22:43