約瑟夫問題的解法

來源:互聯網
上載者:User

約瑟夫問題是個有名的問題:N個人圍成一圈(編號為 0 ~ n-1),從1個開始報數,第M個將被殺掉,

最後剩下一個,其餘人都將被殺掉。求勝利者的編號。例如N=6,M=5, 編號為: [0,1,2,3,4,5]

被殺掉的人的序號為4,3,5,1,2。最後剩下0號。 


令 f(n) 表示 n 個人玩遊戲時勝利者的編號。顯然 f(1) = 0。下面求 f(n) 的遞推公式。

n 個人玩遊戲,第 1 個死的人編號為  k = (m-1) % n, 接下來從 (k+1) 這個人開始報數,參與報數的人的序列為:

k+1, k+2, ....... n-1,   0, 1, 2, ...........k-1     (1)  y    不妨對它們重新編號,得到另一個序列:

0,     1,   ........n-k-2  .......................n-2     (2)  x

把序列(2) 左移 (k+1) 個位置就變成了序列(1), 令 x 和 y 表示兩個序列中位置相同的元素。則有

y = (x + k + 1) % n                                     (3)

殺掉第 1 個人(編號為 k )後,繼續玩下去,勝利者的編號 f(n) 肯定在序列(1)中產生。利用遞推的思想,勝利者

在序列(2)的編號為 f(n-1), 再根據(3)式,勝利者在序列(1) 的編號為 [ f(n-1) + k + 1 ] % n,而勝利

者在序列(1)和序列(2)中都是同一個人,這樣就得到了 遞推公式

f(n) = [ f(n-1) + k + 1 ] % n = [ f(n-1) + (m-1)%n + 1 ] % n = [ f(n-1) + m ] % n
 (n > 1)

f(n) = 0                                                                        
                                  (n == 1)


利用遞推公式,求 n = 6, m = 5 時的勝利者編號 f(6)

f(1) = 0

f(2) = [ f(0) + 5 ] % 2 = 1

f(3) = [ f(2) + 5 ] % 3 = 0

f(4)
= [ f(3) + 5 ] % 4 = 1

f(5)
= [ f(4) + 5 ] % 5 = 1

f(6)
= [ f(5) + 5 ] % 6 = 0

最後得到勝利者的編號為 f(6) = 0

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.