丢手绢问题(约瑟夫问题)的python实现
约瑟夫问题是个有名的问题:N个人围成一圈,从第一个开始报数,第M个将被杀掉,最后剩下一个,其余人都将被杀掉。
1 def fnA(p, personNum, cnt): 2 times = cnt // personNum + 1 3 temp = []; 4 5 for t in range(times): 6 temp = temp + p 7 8 p2 = p[:] 9 p2.remove(temp[cnt-1]) 10 return p2 11 12 13 def fnB(p, cnt): 14 pa = p[:cnt-1] 15 pb = p[cnt:] 16 p = pb + pa 17 return p 18 19 20 cnt = 8 #M 21 personNum = 12 #N 22 23 persons = ["p"+ str(x) for x in range(1, personNum+1)] 24 print(persons) 25 26 personNum = len(persons) 27 if cnt < personNum: 28 while True: 29 persons = fnB(persons, cnt) 30 print(persons) 31 if len(persons) <= cnt: 32 break 33 34 35 personNum = len(persons) 36 while True: 37 persons = fnA(persons, personNum, cnt) 38 print(persons) 39 if len(persons) == 1: 40 break 41 else: 42 personNum = personNum - 1;
改变M和N的值,将会得到不同的值,如下运行效果
如约瑟夫问题,社会永不停息地淘汰着一批批人,那谁又将是最后的幸运者呢。。。
我也不知道,天气好冷,我脚都冻僵了,该睡觉了,晚安!