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
相关产品推荐
相关产品推荐

