約瑟夫環遞推公式推導

2021-10-04 16:24:13 字數 1183 閱讀 7876

一共有 n 個人,編號為1,2,...,n,這些人圍成乙個圈子,然後指定乙個數 m ,從 1 號開始,數到 m 的人出列,並且下乙個人重新開始由 1 計數,問最後乙個出列的人是幾號?

1.通常這類問題會想到使用鍊錶解決,每 m 個就刪除乙個節點

2.也可以用迴圈陣列的方式,對陣列的下標取模

對於以上兩種方法都不適用於解決數目過於大的約瑟夫環問題,而對於約瑟夫環問題有乙個簡潔的遞推公式:

f(n) = (f(n - 1) + m) % n(編號由 0 開始)

其中 f(n) 表示對於 n 個人的約瑟夫環問題的解(即最後乙個出列的人的編號) 

1.設一共有 10 個人,且 m 取 7,進行推導:

首次序號,以及第乙個人出列後的新報數序號如下:

能夠發現,第一行的數列與第二行的數列有乙個對應關係,為了方便統計規律,我們將編號從 0 開始,則:

很容易發現其規律:g(i, 10) = (g(i, 9) + 7) mod 10

其中,-1 < i < 10,i 是正整數,且 i != 6,g(i, n) 表示 n 人環中第 i 人的編號

有了這樣的對應關係,10 人環的第二次出列的編號就可以由 9 人環的第一次出列的編號推導出來;

這樣遞推下去:

out(10, 2) <= out(9, 1)

out(10, 3) <= out(9, 2) <= out(8, 1)

out(10, 10) <= out(9, 9) <= out(8, 8) <= ... <= out(1, 1)

其中 out(n, i) 為 n 人環中,第 i 個出列的編號

而 out(1, 1) = 0

有了以上的推導,我們已經知道能夠將 n = 10 的約瑟夫環問題轉化為乙個 n = 1 的約瑟夫環問題(已知答案)

那麼,如何將之一般化:

對任意的 n, m 將 n 個人從零開始編號,從一開始報數(對於從一開始編號的要注意進行適當處理)

設第 i 個人第一次報數到 m ,則其下乙個 i + 1 編號的人也對應 m 這個編號;

i + 1 和 m 不一定的相等的,因為當 m > n 時,在一次報數中乙個人可能會報兩次,例:

這樣,編號 0 的人同時也擁有編號 7,14

那麼編號為 m 的人又重新開始報數,將之進行新的編號為 0;

即:f(n) = (f(n - 1) + m) % n,對於 f(1) = 0

約瑟夫環 遞推公式

遞推公式 f n,m f n 1,m m n f n,m f n 1,m m nf n 1,m 1 2 3 4 5 6 7 8 9 1001 2345 6789 1234 5678 91045 6789 10127 89101 24510 1245 7845 78101 81014 5458 101...

約瑟夫環問題(遞推公式)

約瑟夫環問題在 具體數學 一書上講得十分詳細 基本問題描述 已知n個人 以編號1,2,3 n分別表示 圍坐在一張圓桌周圍。從編號為1的人開始報數,數到m的那個人出列 他的下乙個人又從1開始報數,數到m的那個人又出列 依此規律重複下去,直到圓桌周圍的人全部出列。也類似於 殺人狂問題 通常解決這類問題時...

知識點 約瑟夫環遞推公式

傳送 遞推公式 f 1 0,f n f n 1 k n。f i 是有i個人時,勝出的那個人的編號 編號從0 n 1 我一開始一直沒理解這個遞推是怎麼來的,後來終於理解了 假設問題是從n個人編號分別為0.n 1,取第k個,則第k個人編號為k 1的淘汰,剩下的編號為 0,1,2,3.k 2,k,k 1,...