約瑟夫問題是個有名的問題: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