约瑟夫环
约瑟夫环是一个数学的应用问题:已知n个人(以编号1,2,3...n分别表示)围坐在一张圆桌周围。从编号为k的人开始报数,数到m的那个人出列;他的下一个人又从1开始报数,数到m的那个人又出列;依此规律重复下去,直到圆桌周围的人全部出列。
模拟场景
下面就来个实际例子:
10(n)个小孩围成一圈,从第1(k)个开始报数:1,2,3,1,2,3,1,2,3......每次报3(m)的小孩退出. 问最后剩下的那个小孩,在之前10人里是第几个?
这里对应约瑟夫环的变量值分别为:
n=10;k=1;m=3;
下面就用面向对象来模拟这个场景,小孩我们可以看成一个类
class Child{
}
小孩有哪些属性呢?
1.报数(小孩当前应该报什么数字),2.位置(小孩一开始所在第几个位置)
理论上只有这两个属性,但是既然是模拟现实场景,那么我们自然而然要考虑到每个小孩的真实处境
小孩围成一个圈,那就说明每一个小孩两边都有小孩,这个隐藏属性不能忽略了.最后我们的小孩类就产生了
// 定义小孩类
class Child{
public Child(int position){
this.position = position;
}
public int number; // 小孩当前的报数
public final int position; // 小孩的初始位置,固定不变的
public Child beforeChild; // 小孩前一个孩子
public Child n