丢手绢问题(约瑟夫问题)的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的值,将会得到不同的值,如下运行效果

 

如约瑟夫问题,社会永不停息地淘汰着一批批人,那谁又将是最后的幸运者呢。。。

我也不知道,天气好冷,我脚都冻僵了,该睡觉了,晚安!

 

posted @ 2017-12-01 22:37  双健  阅读(969)  评论(0编辑  收藏  举报