Pythonはヨセフスの問題を解決する(簡単バージョンを理解します)
ヨセフスの問題:与えられたn個の個人(数字1,2,3と... nが、それぞれ表す)ラウンドテーブルの周りに座っていました。彼は、人へと1 Countin番号からkに隣の人が殺されたです;人の数から、kは殺される者の数であり、kをオフにカウントし始めたので、法律がするまで繰り返されますラウンドテーブルの周りだけ、最後の方。
最初のブログは、展覧会をしてください。
超簡単バージョンを理解する:
アイデアを:ちょうど内側に行くために、すべての人のリストを置くために始めた、数3は、リストから削除されていることを置かれた場合の数字は、行くためにリストの上の位置に人を入れて3最終ではありません報告。以下のように、リストまで2人まで残り:
def josephus(n,k):
#n代表总人数,k代表报数的数字
List = list(range(1,n+1))
index = 0
while List:
temp = List.pop(0)
index += 1
if index == k:
index = 0
continue
List.append(temp)
if len(List)==2:
print(List)
break
if __name__ == '__main__':
josephus(41,3)
-------------------------------------------------- - 私は、行を分割しています--------------------------------------------- ---------------------
片道循環リスト方式(の使用を停止するには、リストの知識を統合するためのメソッド)
の考え方を:一方向の循環リストの使用は、上記と同様の方法で、次のコードで、実際には、次のとおりです。
class Node(object):
"""结点"""
def __init__(self,item):
self.elem = item
self.next = None
class SingleCycleLinkList(object):
"""单向循环链表"""
def __init__(self):
self.head = None
def append(self,item):
node = Node(item)
if self.head is None:
self.head = node
node.next = node
else:
cur = self.head
while cur.next != self.head:
cur = cur.next
cur.next = node
node.next = self.head
def travel(self):
cur = self.head
while cur.next != self.head:
print(cur.elem, end=" ")
cur = cur.next
print(cur.elem)
def remove(self,item):
'''删除节点'''
cur = self.head
pre = None
while cur.next != self.head:
if cur.elem == item:
#头节点的情况
if cur == self.head:
rear = self.head
while rear.next != self.head:
rear = rear.next
rear.next = cur.next
self.head = cur.next
else:
#中间结点的情况
pre.next = cur.next
return
else:
pre = cur
cur = cur.next
#尾节点的情况和一个元素的情况
if cur.elem == item:
# 一个元素的情况
if cur == self.head:
self.head = None
# 尾节点元素的情况
else:
pre.next = self.head
# pre.next = cur.next
def judgement(self):
cur = self.head
count = 1
while cur != cur.next :
cur = cur.next
count += 1
if count == 3:
self.remove(cur.elem)
print("%d-->"%cur.elem,end="")
count = 0
print(cur.elem)
if __name__ == '__main__':
sll = SingleCycleLinkList()
for i in range(1,42):
sll.append(i)
sll.judgement()