约瑟夫环问题

    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;

原文地址:https://www.cnblogs.com/xiatc/p/12372522.html