最近学习《数据结构与算法》,里面遇到了一个比较典型的问题,即Josephus问题:假设有n个人围坐一圈,现在要求从第k个人开始报数,报到第m个数的人退出,然后从下一个人开始继续报数并按照同样规则退出,直至所有人退出,按照要求顺序输出各出列人的编号。下面简单介绍三种解法。
第一种解法:使用list,依次剔除出列人员,具体实现代码如下:
def josp(n, m, k):
l = 1
a = [i for i in range(n)]
sum = k - 1
while len(a) > 1:
sum += m
if sum <= len(a):
print(l, ' ', a[sum - 1])
l += 1
del a[sum -1]
sum -= 1
else:
while sum > len(a):