defysf(n, m):# 特殊情况 m=1if m ==1:return n
# 其他情况
list1 =list(range(1, n +1))# print(list1)
index =0while list1:
index +=1
temp = list1.pop(0)# print(temp)if index == m:
index =0continue
list1.append(temp)iflen(list1)==1:return list1[0]break# print(ysf(3,1))# print(ysf(5,2))
方法二:老师课上方法,所有操作均在原数列中进行
defysf4(n, m):
index, num, counter =0,0,0
persons =[True]* n
# print(persons)while counter < n -1:if persons[index]:
num +=1if num == m:
persons[index]=False
counter +=1
num =0
index +=1
index %= n
return persons.index(True)+1# print(ysf4(n,m))
方法三 单循环链表,复习数据结构而写
classNode():def__init__(self, value,next=None):
self.value = value
self.next=nextdefcreateLink(n):if n <0:returnFalseif n ==1:return Node(1)else:
root = Node(1)
p = root
for i inrange(2, n +1):
p.next= Node(i)
p = p.next
p.next= root
return root
defshowLink(root):
p = root
while1:print(p.value)
p = p.nextif p ==Noneor p == root:breakdefysf_link(n, m):if m ==1:print('survive:', n)return
root = createLink(n)
p = root
while1:for i inrange(m -2):
p = p.nextprint('kill:', p.next.value)
p.next= p.next.next
p = p.nextif p.next== p:breakprint('survive:', p.value)