python 解约瑟夫问题

m个人做成一圈,第n个人,剔除,然后继续数第n个人,再剔除,直到剩下最后一个。求最后一个人的位置。

#先展示一个网上的例子,原理和我的类似。
#
来源于http://blog.csdn.net/dengyaolongacmblog/article/details/39208675 def josephus1(n,k): link=list(range(1,n+1)) print(link) ind=0 for loop_i in range(n-1): ind = (ind+k)% len(link) ind-=1 print('Kill:',link[ind]) del link[ind] if ind==-1: # the last element of link ind=0 print('survival :',link[0]) josephus1(5,3) #我的解法 #coding='utf-8' #约瑟夫问题,一圈人m个,每数到第n个人,就把他踢出。请问谁会留下? def josephus(m,n): a=[1,]*m t=0 #当前位置。 while sum(a)>1: s=0 while sum(a)>1: for i in range(t,m): #print('i-',i) s+=a[i] #print('s',s) if s==n: print('Kill',i) a[i]=0 s=0 #记录当前位置t t=i break else:#t的位置重置 t=0 else: print('Survival is ',a.index(1)) return a.index(1) josephus(5,3)

结果:

[1, 2, 3, 4, 5]
Kill: 3
Kill: 1
Kill: 5
Kill: 2
survival : 4
Kill 2
Kill 0
Kill 4
Kill 1
Survival is 3

#由于第一个是按普通顺序来计算的,我的程序是按python的顺序来计算的。实际的结果一致。

 

posted on 2018-01-01 22:49  guangzhao17  阅读(1185)  评论(0编辑  收藏  举报