约瑟夫问题
N个人围成一圈,第一个人从1开始报数,报M的将被杀掉,下一个人接着从1开始报。如此反复,最后剩下一个,求最后的胜利者。
求解过程
单次求解过程
- 单独一人
直接返回1 - 通用过程
当前编号 | 执行后编号 |
---|---|
1 | n-m+1 |
2 | n-m+2 |
... | ... |
m-1 | n-1(n-m+m-1) |
m | 0(剔除) |
m+1 | 1 |
... | ... |
n-1 | n-1-m |
n | n-m |
int f(int n, int m)
{
return n == 1 ? n : (f(n - 1, m) + m - 1) % n + 1;
}