约瑟夫环:递归算法
假设下标从0开始,0,1,2 .. m-1共m个人,从1开始报数,报到k则此人从环出退出,问最后剩下的一个人的编号是多少?
现在假设m=10
0 1 2 3 4 5 6 7 8 9 k=3
第一个人出列后的序列为:
0 1 3 4 5 6 7 8 9
即:
3 4 5 6 7 8 9 0 1(*)
我们把该式转化为:
0 1 2 3 4 5 6 7 8 (**)
则你会发现: ((**)+3)%10则转化为(*)式了
static public int f1(int m,int k){
int t;
if(m==1)
t=0;
else
t=(f1(m-1,k)+k)%m;
return t;
}
非递归解法
上面推导的逆过程
在知道n-1时,输出的编号为x,那么n时
x'=(x+k)%n
已知在n=1时,x=0
n=2时,x=(0+3)%2=1
static public int f2(int m,int k){
int t=0,n=2;
for(;n<=m;n++)
t=(t+k)%n;
return t;
}