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为当前序列的总人数)那么在第一个人出列之后,k1则是下一次新的编号序列的首位元素,那么我们得到的新的编号序列为:

k1,k1+1,k1+2,k1+3...n-2,n-1,0,1,2...k1-3,k1-2 (k1-1第一次已出列)

那么在这个新的序列中,第一个人依旧是从0开始报数,那么在这个新的序列中,每个人报的相应数字为:

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

那么第二次每个人报的相应数字与第一次时自己相应的编号对应起来的关系则为:

0 --> k1

1 --> k1+1

2 --> k1+2

...

n-2 ---> (k1+n-2)%n1(n1为当前序列的总人数,因为是循环的序列,k1+n-1可能大于总人数)

那么这时我们要解决的问题就是n-1个人的报数问题(即n-1阶约瑟夫环的问题)

可能以上过程你还是觉得不太清晰,那么我们重复以上过程,继续推导剩余的n-1个人的约瑟夫环的问题:

那么在这剩下的n-1个人中,我们也可以为了方便,将这n-1个人编号为:

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

那么此时出列的人的编号则是(m-1) % n2(n2为当前序列的总人数),同样的我们设k2 = m % n2,那么在这个人出列了以后,序列重排,重排后新的编号序列为:

k2,k2+1,k2+2,k2+3...n-2,n-1,0,1,2...k2-3,k2-2 (k2-1第一次已出列)

那么在这个新的序列中,第一个人依旧是从1开始报数,那么在这个新的序列中,每个人报的相应数字为:

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

那么这样的话是不是又把问题转化成了n-2阶约瑟夫环的问题呢?

后面的过程与前两次的过程一模一样,那么递归处理下去,直到最后只剩下一个人的时候,便可以直接得出结果

当我们得到一个人的时候(即一阶约瑟夫环问题)的结果,那么我们是否能通过一阶约瑟夫环问题的结果,推导出二阶约瑟夫环的结果呢?

借助上面的分析过程,我们知道,当在解决n阶约瑟夫环问题时,序号为k1的人出列后,剩下的n-1个人又重新组成了一个n-1阶的约瑟夫环,那么

假如得到了这个n-1阶约瑟夫环问题的结果为ans(即最后一个出列的人编号为ans),那么我们通过上述分析过程,可以知道,n阶约瑟夫环的结果

(ans + k)%n(n为当前序列的总人数),而k = m%n

则有:

n阶约瑟夫环的结果

(ans + m % n)%n,那么我们还可以将该式进行一下简单的化简:

当m<n时,易得上式可化简为:(ans + m)% n

而当m>=n时,那么上式则化简为:(ans % n + m%n%n)% n

即为:(ans % n + m%n)% n

而 (ans + m)% n = (ans % n + m%n)% n

因此得证

(ans + m % n)%n = (ans + m)% n

这样的话,我们就得到了递推公式,由于编号是从0开始的,那么我们可以令

f[1] = 0; //当一个人的时候,出队人员编号为0

f[n] = (f[n-1] + m)%n //m表示每次数到该数的人出列,n表示当前序列的总人数

而我们只需要得到第n次出列的结果即可,那么不需要另外声明数组保存数据,只需要直接一个for循环求得n阶约瑟夫环问题的结果即可

由于往往现实生活中编号是从1-n,那么我们把最后的结果加1即可。

---------------------

(原文:https://blog.csdn.net/jiangjiang_jian/article/details/81744435)


3.代码逻辑

定义函数
1)首先考虑特殊情况,即k=1的时候,就相当于是顺序一个接一个淘汰,那么最后存活的是编号为n的人

2)设n个人,通过输入参数n,生成一个长度为n的列表(注意这里的n不能为1,一直都是这个1,它也就是最后一个),这里使用range函数生成序列,注意range函数的后半括号是包括的,即如range(5)是从0,1,2,3,4.所以需要设为range(1,n+1)

3) 在上一步知道,该问题转换为n-1阶约瑟夫环的问题,要数到k的就把那个位置删除,其中第一次出列的号码是n+k-1/当前序列长度,通过n-1次循环迭代,下一次的出列号码是上一次出列号码+k-1/当前删去出列的新序列,直到剩下的人数为1,才退出循环

4,)设置主函数,输入n,m,k.运行循环即可


4.实验结果展示


©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,875评论 6 496
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,569评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,475评论 0 350
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,459评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,537评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,563评论 1 293
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,580评论 3 414
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,326评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,773评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,086评论 2 330
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,252评论 1 343
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,921评论 5 338
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,566评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,190评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,435评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,129评论 2 366
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,125评论 2 352

推荐阅读更多精彩内容

  • 各校历年复试机试试题 清华、北大、华科试题详细笔记部分,少笔记部分与少数leetcode【含个人整理笔记】 一、详...
    十里江城阅读 1,183评论 0 1
  • 概述 排序有内部排序和外部排序,内部排序是数据记录在内存中进行排序,而外部排序是因排序的数据很大,一次不能容纳全部...
    蚁前阅读 5,178评论 0 52
  • 参考文章 约瑟夫环之二(用递归的思想解决Josephus问题) 解释 解法 初始情况: 0, 1, 2 ........
    Mjolnir1107阅读 1,004评论 0 1
  • 这个年头,新媒体的兴起对小编的考验不仅仅是一篇文章的标题或者是文章的排版怎么样了,更多的是考验一个人对这个一件事情...
    我是一直流浪的猪阅读 604评论 0 1
  • 大学室友是一名铁路基层职工,前段时间一起参加了另一个大学同学的婚礼。几年没见,他不甘于现状的想法还是那么多,不过更...
    春申逐客阅读 522评论 0 2