约瑟夫问题的python代码及注释_python约瑟夫问题-最全面,经典

1.需求---- 经典约瑟夫问题

首先,我们需要知道什么是约瑟夫问题?即设有n个人围成一圈,现从第m个人开始报数,数到第m1人淘汰或者退出,然后从出列的下一个m+1个人重新报数,数到m的人出列..........如此循环,直到所有的人全部出列(延伸直到剩下一个玩家时游戏结束),约瑟夫的问题是:对于任意给定的n,m,k求出按次序得到的出列人序列。

后续根据这个问题进行了拓展,如确定m为1,即从第1个人开始报数,直到剩下一个时游戏结束,这个玩家就是游戏获胜者。在n,k知道的情况下求最后留下的是原来第几号的那位。

需求: 万变不离其宗,后续的变体其实都是在n,m,k基础上进行控制变量的,因此我们可以写一个代码,覆盖这三个变量求解约瑟夫问题,针对m变量是1的情况下也可以覆盖。

2.解题思路分析

为了简化出列的过程: m=1

首先我们把这n个人的序号编号从0~n-1(理由很简单,由于m是可能大于n的,而当m大于等于n时,那么第一个出列的人编号是m%n,而m%n是可能等于0的,这样编号的话能够简化后续出列的过程),当数到m-1的那个人出列,因此我们编号完成之后,开始分析出列的过程:

第一次出列:

一开始的时候,所有人的编号排成序列的模式即为:

0,1,2,3,4,5...n-2,n-1

那么第一次出列的人的编号则是(m-1)%n1,那么在第一个人出列之后,从他的下一个人又开始从0开始报数,为了方便我们设k1 = m%n1(n1为

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值