约瑟夫环的问题,具体到某个编码来解决可谓是很多很多,这里对于约瑟夫环先打个比方:一辆小巴车被查出严重超车,最多载10人的超载至30人。于是乘客下车排成一队,排队的位置即为他们的编号。然后就是报数,从1开始,数到6的人被安排滞后乘车。如此循环,直到不超过 10 人为止,问都有哪些编号的人需要下车了,哪些编号可以乘车?当然这里只考虑仅有一辆车的情况哈,至于后续车和后续登车的问题不做考虑哈。
python代码把编号和列表元素的值一一对应了,每次移除了列表中编号(值)的匹配项。
#!/usr/bin/env python3
# -*- coding: UTF-8 -*-
#
def joseph(totalnum, step, staynum):
lists = list(range(1, totalnum+1))
checkcnt = 0
while len(lists) > staynum:
for i in lists[:]: # 列表中的值 不是列表的索引 lists[:]
checkcnt += 1
if checkcnt == step:
checkcnt = 0
lists.remove(i) # 移除列表中某个值的第一个匹配项 list.remove(obj)
print("%-3d号下车了" % i)
return lists
stays = joseph(30, 6, 10)
print("最后留下%-3d人" % len(stays))
print("编号是:", stays)