约瑟夫生死游戏新解(pyhton版)

本文介绍了使用列表方法解决约瑟夫环问题的解题思路,通过循环和列表操作,模拟15人下船的过程,最后提供一个可调用的函数实现通用求解。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目:约瑟夫生者死者小游戏
30 个人在一条船上,超载,需要 15 人下船。
于是人们排成一队,排队的位置即为他们的编号。
报数,从 1 开始,数到 9 的人下船。
如此循环,直到船上仅剩 15 人为止,问都有哪些编号的人下船了呢?

解题思路:

网上搜到的教程多为字典法,这里是使用列表的方法提供一种思路,以供参考。

1、生成1-30的列表ls,用来表示30个人的序号

2、分割列表ls为ls1,ls2。ls1为前9个数字,ls2为后面的数字。

3、输出ls1的最后一个数字,然后删除,把新的ls1附加到ls2之后,形成新的ls列表

4、如此循环15次

具体代码如下:

ls=[x for x in range(1,31)]#生成序号列表
for i in range(15):#循环15次
#列表分为两组,ls1列表为前9个数字
    ls1=ls[:9]
    ls2=ls[9:]
    print('%2d号下船了'%ls1[-1])#输出下船序号
    del ls1[-1]#删除列表1中的最后一个数字
    ls2.extend(ls1)#删除下船序号后的列表1附加到ls2
    ls=ls2#新生成的ls2赋值给ls,表示船上人数已经更新,重新进入循环

利用以上代码定义一个函数,使其更具有普适性,具体如下

def yuesefu():
    n=eval(input('船上总人数'))
    m=eval(input('下船序号'))
    p=eval(input('需下船总人数'))
    ls=[x for x in range(1,n+1)]
    for i in range(p):
        ls1=ls[:m]
        ls2=ls[m:]
        print('%2d号下船了'%ls1[-1])
        del ls1[-1]
        ls2.extend(ls1)
        ls=ls2
if __name__=='__main__':
    yuesefu()

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值