qq_33325201 2022-05-23 23:40 采纳率: 100%
浏览 32
已结题

Python 约瑟夫生者死者小游戏,

30 个人在一条船上,超载,需要 15 人下船。于是人们排成一队,排队的位置即为他们的编号。报数,从 1 开始,数到 9 的人下船。如此循环,直到船上仅剩 15 人为止,问都有哪些编号的人下船了呢?
问题:前半部分都正确的,为啥后面就出错了呢,求高手指教
代码如下:
P = []
for i in range(1, 31):
P.append(i)
c = 1
for j in range(1, 16):
while len(P) == 15:
break
else:
for p in P:
if c == 9:
print("{}号下船了".format(p))
P.remove(p)
print(P)
c = 2
else:
c += 1

  • 写回答

1条回答 默认 最新

  • 请叫我问哥 Python领域新星创作者 2022-05-24 00:15
    关注

    一般不建议在遍历列表的同时修改列表,这样会造成遍历错误,除非有十足的把握。看到你在删除列表元素后,将变量 c 赋值为2,用于补偿因为列表长度变化造成的遍历问题,但是忽视了一个小问题,如果删掉的是列表的最后一个元素(游戏第9轮当30号下船的时候),下一次遍历是从列表的头部开始,c应该是1。
    所以,在你的代码上修改如下:

    P = []
    for i in range(1, 31):
        P.append(i)
        c = 1
    for j in range(1, 16):
        if c==2:c=1
        while len(P) == 15:
            break
        else:
            for p in P:
                if c == 9:
                    print("{}号下船了".format(p))
                    P.remove(p)
                    print(P)
                    c = 2
                else:
                    c += 1
    

    但是这样会存在一个小问题,就是当人数只有2人的时候,会陷入死循环(当然本题不会存在这种情况),最好是想另一个算法来解决这个问题。
    我会这样写:

    n = 30
    k = 15
    i = 9
    people = list(range(1,n+1))
    while len(people)>k:
        j = (i-1)%len(people)
        print(f'{people[j]}号下船了')
        people = people[j+1:]+people[:j]
        print(people)
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录

报告相同问题?

问题事件

  • 系统已结题 6月1日
  • 已采纳回答 5月24日
  • 创建了问题 5月23日

悬赏问题

  • ¥15 求lingo代码和思路
  • ¥15 公交车和无人机协同运输
  • ¥15 stm32代码移植没反应
  • ¥15 matlab基于pde算法图像修复,为什么只能对示例图像有效
  • ¥100 连续两帧图像高速减法
  • ¥15 如何绘制动力学系统的相图
  • ¥15 对接wps接口实现获取元数据
  • ¥20 给自己本科IT专业毕业的妹m找个实习工作
  • ¥15 用友U8:向一个无法连接的网络尝试了一个套接字操作,如何解决?
  • ¥30 我的代码按理说完成了模型的搭建、训练、验证测试等工作(标签-网络|关键词-变化检测)