約瑟夫環問題 遞迴推導

2021-07-10 13:03:13 字數 1154 閱讀 1888

題目描述:

n個數,編號為 0 , 1, ……, n-1 排成乙個圓圈,從數字 0 開始,每次從這個圓圈中刪除第 m 個數,請問最後乙個剩下的數是多少?

推導過程

定義乙個函式f(n, m)為 n 個數中取 m 最後剩下的編號。

第乙個被刪除的數是(m-1)%n, 記為 k 。此時因為序列已經不連續,函式可以定義為f』 ( n-1, m)

明顯,最後剩下的編號相等,於是:f(n,m) = f』(n-1, m)

然後我們對剩下的數做乙個簡單的對映:

k+1 –> 0

k+2 –> 1

. .

n-1 –> n-k-2

0 –> n-k-1

1 –> n-k

. .

k-1 –> n-2

這個對映可以記為

p(x) = (x-k-1)%n

其中 x 為對映前的數 (可以自己推導一下)

那麼逆對映就是:

p-1(x) = (x + k + 1 ) %n

(還是建議自己推導一下)

那麼,對於上面的函式 f』(n-1, m),就有

f』(n-1, m) = p-1[f(n-1, m)] = [f(n-1, m) + k +1]%n = f(n, m)

k= (m-1)%n代入:

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

這就是我們要的通項公式。

很明顯,當 n = 1 時,f = 0;

於是:

f(n, m) = 0, n = 1

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

使用迴圈就可以輕鬆解決這個問題了。

–end–

約瑟夫環遞推公式推導

一共有 n 個人,編號為1,2,n,這些人圍成乙個圈子,然後指定乙個數 m 從 1 號開始,數到 m 的人出列,並且下乙個人重新開始由 1 計數,問最後乙個出列的人是幾號?1.通常這類問題會想到使用鍊錶解決,每 m 個就刪除乙個節點 2.也可以用迴圈陣列的方式,對陣列的下標取模 對於以上兩種方法都不...

約瑟夫環問題C 遞迴解法

約瑟夫環 約瑟夫問題 是乙個數學的應用問題 已知n個人 以編號1,2,3.n分別表示 圍坐在一張圓桌周圍。從編號為k的人開始報數,數到m的那個人出列 他的下乙個人又從1開始報數,數到m的那個人又出列 依此規律重複下去,直到圓桌周圍的人全部出列。通常解決這類問題時我們把編號從0 n 1,最後 1 結果...

約瑟夫問題 約瑟夫環

約瑟夫 問題 有時也稱為約瑟夫斯置換,是乙個出現在電腦科學和數學中的問題。在計算機程式設計的演算法中,類似問題又稱為約瑟夫環。又稱 丟手絹問題 據說著名猶太歷史學家 josephus有過以下的故事 在羅馬人占領喬塔帕特後,39 個猶太人與josephus及他的朋友躲到乙個洞中,39個猶太人決定寧願死...