约瑟夫环(约瑟夫问题)是一个数学的应用问题:已知n个人(以编号1,2,3…n分别表示)围坐在一张圆桌周围。从编号为k的人开始报数,数到m的那个人出列;他的下一个人又从1开始报数,数到m的那个人又出列;依此规律重复下去,直到圆桌周围的人全部出列(或者求最后一个出列的人的编号)。
这里提供了三种方法:
逻辑去除法;
递归法;
线性表法。
这个问题我觉得应该也可以用循环队列来解决,这种方法以后再加上。
逻辑去除法
1 | /** |
递归方法
1 | /** |
线性表法
1 | /** |
对于线性表法的解释:每个人出列后,剩下的人又组成了另一个子问题。只是他们的编号变化了。第一个出列的人肯定是a[1] = m(mod)n(m/n的余数),他除去后剩下的人编号是a[1]+1、a[1]+2、…、n、1、2、…a[1]-2、a[1]-1,对应的新编号是1,2,3…n-1。设此时某个人的新编号是i,他原来的编号就是(i+a[1])%n。于是,这便形成了一个递归问题。假如知道了这个子问题(n-1个人)的解是x,那么原问题(n个人)的解便是:(x+m%n)%n = (x+m)%n。问题的起始条件:如果n=1,那么结果就是1。
Read More: