关于约瑟夫环问题的解题方法可参考:
http://www.cnblogs.com/woodfish1988/archive/2007/02/18/652251.html。
http://blog.163.com/elite_lcf/blog/static/678395382009931105328270/
本文着重介绍用递归思想解题时,映射关系的推导,这部分很多文章都一笔带过没有讲清楚,以下即为从长度为n-1序列中得出的解如何映射到长度为n的序列:
(1)若序列从1开始编号
映射关系的推导:
序列一: 1 2 3 ... k-1 k k+1 ... n 长度为n的序列
序列二: 1 2 3 ... k-1 k+1 ... n 删除K
序列三: k+1 k+2 ... n 1 2 ... k-1 重排序
序列四:1 2 3 ... n-k n-k+1 n-k+2 ... n-1
若求出序列四中胜利者编号为x,则它映射到序列三的编号为x`(在序列三中编号即为在长度为n序列的编号):
(1)当x<n-k时(k>0,n>0)
x` = k+x;->k+x=(k+x-1)%n + 1
(2)当x>n-k时(且x<=n-1)
x` = x-(n-k);->x-(n-k)=(x-n+k)%(n)=(x-n+k+n)%n=(x+k)%(n)=(x+k-1)%n + 1
(3)当x=n-k时
x`= n = (x+k-1)%n +1
因此不论x为何值都有x` = (x+k-1)%n +1
显然:f(1)=1
因此有:从1开始编号的映射关系为:
f(1)=1
f(n)=((f(n-1)+k-1)%n +1)
(2)从0开始编号
序列一: 0 1 2 ... k-1 k k+1 ... n-1
序列二: 0 1 2 ... k k+1 ... n-1 删除k-1
序列三: k k+1 ... n-1 0 1 ... k-2 重排序
序列四:0 1 ... n-k-1 n-k n-k+1 ... n-2
若求出序列四中胜利者编号为x,则它映射到序列三的编号为x`(在序列三中编号即为在长度为n序列的编号):
//从0开始编号
1)当x<=n-k时(k>0,n>0)
x` = k+x;->k+x=(k+x)%n
(2)当x>n-k时
x` = x-(n-k);->x-(n-k)=(x-n+k)%(n)=(x-n+k-n)%n=(x+k)%(n)
因此不论x为何值都有x`= (f(n-1)+k)%n
显然:f(1) = 0;
因此有:从0开始的映射关系为:
f(1) = 0;
f(n)=((f(n-1)+k)%n)