python約瑟夫問題-最全面,經(jīng)典

1.需求---- 經(jīng)典約瑟夫問題

首先究反,我們需要知道什么是約瑟夫問題寻定?即設有n個人圍成一圈,現(xiàn)從第m個人開始報數(shù)精耐,數(shù)到第m1人淘汰或者退出狼速,然后從出列的下一個m+1個人重新報數(shù),數(shù)到m的人出列..........如此循環(huán)卦停,直到所有的人全部出列(延伸直到剩下一個玩家時游戲結(jié)束)向胡,約瑟夫的問題是:對于任意給定的n,m,k求出按次序得到的出列人序列恼蓬。

? 后續(xù)根據(jù)這個問題進行了拓展,如確定m為1僵芹,即從第1個人開始報數(shù)处硬,直到剩下一個時游戲結(jié)束,這個玩家就是游戲獲勝者拇派。在n,k知道的情況下求最后留下的是原來第幾號的那位荷辕。

需求: 萬變不離其宗,后續(xù)的變體其實都是在n,m,k基礎上進行控制變量的件豌,因此我們可以寫一個代碼疮方,覆蓋這三個變量求解約瑟夫問題,針對m變量是1的情況下也可以覆蓋茧彤。

2.解題思路分析

為了簡化出列的過程: m=1

首先我們把這n個人的序號編號從0~n-1(理由很簡單骡显,由于m是可能大于n的,而當m大于等于n時曾掂,那么第一個出列的人編號是m%n蟆盐,而m%n是可能等于0的,這樣編號的話能夠簡化后續(xù)出列的過程)遭殉,當數(shù)到m-1的那個人出列石挂,因此我們編號完成之后,開始分析出列的過程:

第一次出列:

一開始的時候险污,所有人的編號排成序列的模式即為:

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

那么第一次出列的人的編號則是(m-1)%n1,那么在第一個人出列之后蛔糯,從他的下一個人又開始從0開始報數(shù)拯腮,為了方便我們設k1 = m%n1(n1為當前序列的總?cè)藬?shù))那么在第一個人出列之后,k1則是下一次新的編號序列的首位元素蚁飒,那么我們得到的新的編號序列為:

k1动壤,k1+1,k1+2淮逻,k1+3...n-2琼懊,n-1,0爬早,1哼丈,2...k1-3,k1-2 (k1-1第一次已出列)

那么在這個新的序列中筛严,第一個人依舊是從0開始報數(shù)醉旦,那么在這個新的序列中,每個人報的相應數(shù)字為:

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

那么第二次每個人報的相應數(shù)字與第一次時自己相應的編號對應起來的關系則為:

0 --> k1

1 --> k1+1

2 --> k1+2

...

n-2 ---> (k1+n-2)%n1(n1為當前序列的總?cè)藬?shù)车胡,因為是循環(huán)的序列檬输,k1+n-1可能大于總?cè)藬?shù))

那么這時我們要解決的問題就是n-1個人的報數(shù)問題(即n-1階約瑟夫環(huán)的問題)

可能以上過程你還是覺得不太清晰,那么我們重復以上過程匈棘,繼續(xù)推導剩余的n-1個人的約瑟夫環(huán)的問題:

那么在這剩下的n-1個人中丧慈,我們也可以為了方便,將這n-1個人編號為:

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

那么此時出列的人的編號則是(m-1) % n2(n2為當前序列的總?cè)藬?shù))羹饰,同樣的我們設k2 = m % n2伊滋,那么在這個人出列了以后,序列重排队秩,重排后新的編號序列為:

k2笑旺,k2+1,k2+2馍资,k2+3...n-2筒主,n-1,0鸟蟹,1乌妙,2...k2-3,k2-2 (k2-1第一次已出列)

那么在這個新的序列中建钥,第一個人依舊是從1開始報數(shù)藤韵,那么在這個新的序列中,每個人報的相應數(shù)字為:

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

那么這樣的話是不是又把問題轉(zhuǎn)化成了n-2階約瑟夫環(huán)的問題呢泽艘?

后面的過程與前兩次的過程一模一樣,那么遞歸處理下去镐依,直到最后只剩下一個人的時候匹涮,便可以直接得出結(jié)果

當我們得到一個人的時候(即一階約瑟夫環(huán)問題)的結(jié)果,那么我們是否能通過一階約瑟夫環(huán)問題的結(jié)果槐壳,推導出二階約瑟夫環(huán)的結(jié)果呢然低?

借助上面的分析過程,我們知道务唐,當在解決n階約瑟夫環(huán)問題時雳攘,序號為k1的人出列后,剩下的n-1個人又重新組成了一個n-1階的約瑟夫環(huán)绍哎,那么

假如得到了這個n-1階約瑟夫環(huán)問題的結(jié)果為ans(即最后一個出列的人編號為ans)来农,那么我們通過上述分析過程,可以知道崇堰,n階約瑟夫環(huán)的結(jié)果

(ans + k)%n(n為當前序列的總?cè)藬?shù)),而k = m%n

則有:

n階約瑟夫環(huán)的結(jié)果

(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表示每次數(shù)到該數(shù)的人出列薄风,n表示當前序列的總?cè)藬?shù)

而我們只需要得到第n次出列的結(jié)果即可,那么不需要另外聲明數(shù)組保存數(shù)據(jù)拍嵌,只需要直接一個for循環(huán)求得n階約瑟夫環(huán)問題的結(jié)果即可

由于往往現(xiàn)實生活中編號是從1-n遭赂,那么我們把最后的結(jié)果加1即可。

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

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


3.代碼邏輯

定義函數(shù)
1)首先考慮特殊情況横辆,即k=1的時候撇他,就相當于是順序一個接一個淘汰,那么最后存活的是編號為n的人

2)設n個人狈蚤,通過輸入?yún)?shù)n困肩,生成一個長度為n的列表(注意這里的n不能為1,一直都是這個1脆侮,它也就是最后一個)锌畸,這里使用range函數(shù)生成序列,注意range函數(shù)的后半括號是包括的靖避,即如range(5)是從0,1,2,3,4.所以需要設為range(1潭枣,n+1)

3) 在上一步知道,該問題轉(zhuǎn)換為n-1階約瑟夫環(huán)的問題筋蓖,要數(shù)到k的就把那個位置刪除卸耘,其中第一次出列的號碼是n+k-1/當前序列長度,通過n-1次循環(huán)迭代粘咖,下一次的出列號碼是上一次出列號碼+k-1/當前刪去出列的新序列蚣抗,直到剩下的人數(shù)為1,才退出循環(huán)

4,)設置主函數(shù)瓮下,輸入n,m,k.運行循環(huán)即可


4.實驗結(jié)果展示


?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末翰铡,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子讽坏,更是在濱河造成了極大的恐慌锭魔,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,290評論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件路呜,死亡現(xiàn)場離奇詭異迷捧,居然都是意外死亡织咧,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,107評論 2 385
  • 文/潘曉璐 我一進店門漠秋,熙熙樓的掌柜王于貴愁眉苦臉地迎上來笙蒙,“玉大人,你說我怎么就攤上這事庆锦⊥蔽唬” “怎么了?”我有些...
    開封第一講書人閱讀 156,872評論 0 347
  • 文/不壞的土叔 我叫張陵搂抒,是天一觀的道長艇搀。 經(jīng)常有香客問我,道長求晶,這世上最難降的妖魔是什么焰雕? 我笑而不...
    開封第一講書人閱讀 56,415評論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮誉帅,結(jié)果婚禮上淀散,老公的妹妹穿的比我還像新娘。我一直安慰自己蚜锨,他們只是感情好档插,可當我...
    茶點故事閱讀 65,453評論 6 385
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著亚再,像睡著了一般郭膛。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上氛悬,一...
    開封第一講書人閱讀 49,784評論 1 290
  • 那天则剃,我揣著相機與錄音,去河邊找鬼如捅。 笑死棍现,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的镜遣。 我是一名探鬼主播己肮,決...
    沈念sama閱讀 38,927評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼悲关!你這毒婦竟也來了谎僻?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,691評論 0 266
  • 序言:老撾萬榮一對情侶失蹤寓辱,失蹤者是張志新(化名)和其女友劉穎艘绍,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體秫筏,經(jīng)...
    沈念sama閱讀 44,137評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡诱鞠,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,472評論 2 326
  • 正文 我和宋清朗相戀三年挎挖,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片般甲。...
    茶點故事閱讀 38,622評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡肋乍,死狀恐怖鹅颊,靈堂內(nèi)的尸體忽然破棺而出敷存,到底是詐尸還是另有隱情,我是刑警寧澤堪伍,帶...
    沈念sama閱讀 34,289評論 4 329
  • 正文 年R本政府宣布锚烦,位于F島的核電站,受9級特大地震影響帝雇,放射性物質(zhì)發(fā)生泄漏涮俄。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,887評論 3 312
  • 文/蒙蒙 一尸闸、第九天 我趴在偏房一處隱蔽的房頂上張望彻亲。 院中可真熱鬧,春花似錦吮廉、人聲如沸苞尝。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,741評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽宙址。三九已至,卻和暖如春调卑,著一層夾襖步出監(jiān)牢的瞬間抡砂,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,977評論 1 265
  • 我被黑心中介騙來泰國打工恬涧, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留注益,地道東北人。 一個月前我還...
    沈念sama閱讀 46,316評論 2 360
  • 正文 我出身青樓溯捆,卻偏偏與公主長得像丑搔,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子现使,可洞房花燭夜當晚...
    茶點故事閱讀 43,490評論 2 348

推薦閱讀更多精彩內(nèi)容

  • 各校歷年復試機試試題 清華低匙、北大、華科試題詳細筆記部分碳锈,少筆記部分與少數(shù)leetcode【含個人整理筆記】 一顽冶、詳...
    十里江城閱讀 1,179評論 0 1
  • 概述 排序有內(nèi)部排序和外部排序,內(nèi)部排序是數(shù)據(jù)記錄在內(nèi)存中進行排序售碳,而外部排序是因排序的數(shù)據(jù)很大强重,一次不能容納全部...
    蟻前閱讀 5,168評論 0 52
  • 參考文章 約瑟夫環(huán)之二(用遞歸的思想解決Josephus問題) 解釋 解法 初始情況: 0, 1, 2 ........
    Mjolnir1107閱讀 1,003評論 0 1
  • 這個年頭绞呈,新媒體的興起對小編的考驗不僅僅是一篇文章的標題或者是文章的排版怎么樣了,更多的是考驗一個人對這個一件事情...
    我是一直流浪的豬閱讀 604評論 0 1
  • 大學室友是一名鐵路基層職工圾亏,前段時間一起參加了另一個大學同學的婚禮。幾年沒見封拧,他不甘于現(xiàn)狀的想法還是那么多志鹃,不過更...
    春申逐客閱讀 520評論 0 2