约瑟夫环问题
public static Integer getResult(int n,int m){ return n==1?n:(getResult(n-1, m)+m-1)%n+1; }
问题描述:编号为 1-N 的 N 个士兵围坐在一起形成一个圆圈,从编号为 1 的士兵开始依次报数(1,2,3…这样依次报),数到 m 的 士兵会被杀死出列,之后的士兵再从 1 开始报数。直到最后剩下一士兵,求这个士兵的编号。
如果n=1时 则结果是1,设函数f(n,m)表示求取的函数,则只需要找到n 和n-1的关系 就可以根据递归找到f(n,m)的值
原值old 新值new(执行完一次后去掉m后 形成的新的编号)
1
2
3
...
m-2 n-2
m-1 n-1
m
m+1 1
m+2 2
..
n-1
n
所以得出old=(new +m)%n 为了避免new+m=n时的情况 所以改进成 old=(new+m-1)%n+1;