约瑟夫环问题-以python为舟

约瑟夫环问题-以python为舟


前言

约瑟夫环的大致意思就是:N个人围成一圈,第一个人从1开始报数,报M的将被杀掉,下一个人接着从1开始报。如此反复,最后剩下一个,求最后的胜利者。因此我编写了一个算法来解决约瑟夫环的问题。


一、约瑟夫环的实现原理

约瑟夫环问题的主要难度在于当我们除掉一个成员时,这个时候再从下一个人开始报数时是从1开始报数,在本篇叙述中我们以python中的队列也就是list来模拟约瑟夫环,因此模拟报数是从0开始报数,但无伤大雅,然而最大的问题在于如何实现这种接着下一个成员重新报数的实现方法,当解决了这个问题,整个约瑟夫环的问题就迎刃而解。

二、具体的实现方法

1.分割列表-用于解决重新报数问题

代码如下(示例):

        # 进行列表反转操作
        second_list = member_list[:i:-1]
        frist_list = member_list[:i]

我们定义了一个member_list的列表用于存放成员数据,当我们指定了一个淘汰数时,此时判断此时的指定淘汰数和成员数据所在的索引是否相同便能进行删除成员数据的操作,我们用以上的切片操作来分割列表,之后再利用符号“+”来讲两个列表重新合并就能实现每个成员数据索引值的修改。

        # 合并列表形成新的列表
        member_list = second_list + frist_list

2.完整代码

代码如下(示例):

# ======约瑟夫环问题======

member_list = []
n = eval(input("请指定约瑟夫环成员个数:"))
for i in range(0, n):
    member_list.append(str(i))
print("人数设置成功!约瑟夫环成员如下:\n")
print(member_list)
# 执行约瑟夫环问题
out_num = eval(input("指定一个淘汰数字:"))
i = 0
while i < len(member_list):
    # 定义一个参考列表
    item = []
    for j in member_list:
        item.append(j)
    # 执行删除成员操作
    if member_list.index(item[i]) == out_num:
        print("淘汰成员为" + member_list[out_num] + ",此时剩余成员为:")
        # 进行列表反转操作
        second_list = member_list[:i:-1]
        frist_list = member_list[:i]
        # 删除指定元素
        member_list.remove(item[i])
        # 合并列表形成新的列表
        member_list = second_list + frist_list
        print(member_list)
        # 重置遍历索引
        i = 0
    else:
        i += 1
print("此时获胜成员为:")
for i in range(0, len(member_list)):
    print(member_list[i]))

以上算法用while循环不断遍历列表以及进行列表重组,当列表不断进行重组时成员数也在不断减少,最终决定出胜者。以上算法灵活的实现了各种数量的约瑟夫环。


运行结果

提示:这里对文章进行总结:

请指定约瑟夫环成员个数:10
人数设置成功!约瑟夫环成员如下:

['0', '1', '2', '3', '4', '5', '6', '7', '8', '9']
指定一个淘汰数字:2
淘汰成员为2,此时剩余成员为:
['9', '8', '7', '6', '5', '4', '3', '0', '1']
淘汰成员为7,此时剩余成员为:
['1', '0', '3', '4', '5', '6', '9', '8']
淘汰成员为3,此时剩余成员为:
['8', '9', '6', '5', '4', '1', '0']
淘汰成员为6,此时剩余成员为:
['0', '1', '4', '5', '8', '9']
淘汰成员为4,此时剩余成员为:
['9', '8', '5', '0', '1']
淘汰成员为5,此时剩余成员为:
['1', '0', '9', '8']
淘汰成员为9,此时剩余成员为:
['8', '1', '0']
淘汰成员为0,此时剩余成员为:
['8', '1']
此时获胜成员为:
8
1

进程已结束,退出代码为 0

总结

对于python来说,python内部有内置的列表结构以及其他内置方法和函数都造成了诸多的方便,因此对于数据的操作就会很有效率,列表就类似于数据结构中的队列一样,约瑟夫环的问题就与循环队列的实现原理很相似,因此对于一些用其他语言来实现约瑟夫环问题的人来说比如c++、c#等程序语言就可以实习一个循环队列的struck结构或者class类,当然并不一定就要用循环队列来解决这个问题,最关键的还是重新报数问题,也就是删除元素后在重组列表的问题,相较于python,其他更为复杂的语言实现方法就会更难。

  • 1
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值