公式法:
f(n,m) = (f(n-1,m) + m) % n
f(1,m) = 0 (索引從0開始)
f是每一輪中存活的人對應的編號。
遞推過程如下:設編號為2的出局(即m=3)
已知f(1,m) = 0,即只有乙個人的隊伍中,存活的肯定是編號0
從最後一輪f(1,m)求解倒數第二輪f(2,m):
倒數第二輪有兩個人,殺掉乙個人後剩餘一人;
那對應的報號順序為: 0 1 20,(最後乙個0對應的存活的人,也就是最後一輪的編號)
實際報號順序對應的編號是:0 1/ 01(上下對應,最後剩的人對應編號為1.)
故倒數第二輪(0,1),剩餘的是編號為1
倒數第三輪同理
報號順序: 0 1 2 01(最後的0,1表示這輪之後存活的人,也就是倒數第二輪中人的編號)
實際編號: 0 1 2/ 01(這一輪實際有三個人,對應實際編號,最後剩餘的人也是編號1)
故倒數第三輪(0,1,2),剩餘的是編號為1
倒數第四輪
報號順序: 0 1 2 012(最後的0,1,2表示這輪之後存活的人,也就是倒數第三輪輪中人的編號)
實際編號: 0 1 2 3/01(這一輪實際有4個人,對應實際編號,最後剩餘的人也是編號1)
故倒數第三輪(0,1,2,3),剩餘的是編號為0
倒數第五輪
報號順序:0 1 201 2
實際順序:0 1 234/ 0
故下一輪中這一輪中對應的是編號3
歸納可以得到結論,如果我們知道n-1個人中,最終剩餘的人的編號,那麼,就可以得到n個人最終剩餘的編號
因為從n個人到n-1個人,一定經過了1次,0到m-1的報號,如圖所示
紅色的n-1個編號就是就是下一輪n-1個人的實際編號順序,也可以與n中的編號相對應了。
所以n-1中倖存者編號對應n中倖存者編號就是:
f(n,m) = (f(n-1,m)+m)%n
例如,如果f(n-1,m)=1,那麼它在f(n,m)中的編號為m+1.
約瑟夫環(鍊錶法,公式法)
約瑟夫環作為乙個數學問題,它的 實現方式有很多,比如迴圈鍊錶,公式解決或者動態規劃,之前參考資料也有用遞迴解決的。anyway,這些都是解決約瑟夫環問題很有效的方法。這裡總結兩種方法,迴圈鍊錶法和公式法。首先是迴圈鍊錶法,它的原理很簡單,也很容易理解。求解過程和人思考解決的過程很接近。設總人數為n,...
約瑟夫環 遞推公式
遞推公式 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...
leetcode之約瑟夫環問題,妙哉公式法
約瑟夫環問題是n個人圍成一圈,從第乙個人開始報數,報到m的人出圈,剩下的人繼續從1開始報數,報到m的人出圈 如此往復,直到最後只剩下1個人。而今天的leetcode面試題62.圓圈中最後剩下的數字正是約瑟夫環問題,題目如下。思路一 迴圈鍊錶法 在我們學習基礎的資料結構時,迴圈鍊錶可謂是專為約瑟夫環問...