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日

悬赏问题

  • ¥40 图书信息管理系统程序编写
  • ¥15 7-1 jmu-java-m02-使用二维数组存储多元线性方程组
  • ¥20 Qcustomplot缩小曲线形状问题
  • ¥15 企业资源规划ERP沙盘模拟
  • ¥15 树莓派控制机械臂传输命令报错,显示摄像头不存在
  • ¥15 前端echarts坐标轴问题
  • ¥15 ad5933的I2C
  • ¥15 请问RTX4060的笔记本电脑可以训练yolov5模型吗?
  • ¥15 数学建模求思路及代码
  • ¥50 silvaco GaN HEMT有栅极场板的击穿电压仿真问题