Python ALIVE AND DEAD – JosephLoendorf
方法一:
#约瑟夫环问题,n=30,报数为9的下船,最终船上剩下15人
li=list(range(30))
countNum=1
#下船人数计数 取值1-15
while countNum<=15:
i=1
#排序计数,取值1-9
while i<9:
li.append(li.pop(0))
#每遍历一个元素,把当前元素追加到列表末尾,这样做是为了方便循环遍历
i+=1
print('{}号下船了'.format(li.pop(0)+1))
countNum +=1
思想就是:队列从头开始按顺序报 1-9 之间的数,报完数的人站到队列末尾,报数是 9 的成员下船,如果有人下船,则下一个人从 1 开始报数,循环继续,直至下船人数达到 15 人停止。
所以该方法特点:第一、报数的人一定站在队列首位,当然下船的人也是在首位。第二、每下船一人,队列长度减一。第三、下船人号码正好是初始序列号码,在编程中表现即是下船号码是列表索引加 1。
方法二:
使用列表切片来生成新的队列,并且改进之前的初始生成序列 0-29 为 1-30。
#利用切片来生成新的队列
li=list(range(1,31))
countNum=1
for i in li:
if countNum<=15:
print('{}号下船了'.format(li[8]))
li=li[9:]+li[:8]
countNum +=1