我一直试图对Josephus problem进行编程,由于某种原因它只在某些情况下工作,我不确定为什么。 TL; DR的工作原理如下:
你有一群X人。每个第N个人都将被杀死,直到只剩下一个最后一个人。所以说例如你有10个[AKA:X]人,你决定杀死每个第3个[AKA:N]人,它会是这样的:
第一轮:1,2,(3次死亡),4次,5次,(6次死亡),7次,8次,(9次死亡),10次
第二轮:1,(2死因为它是连续的圆圈),3,5,(7死),8,10
第3轮:(1),4,5,(8),10
第四轮:4,(5),10 第五轮:4,(10)我们最终只剩下4号人作为唯一的幸存者。
我的程序完全没问题。但是,当我输入X为55
而N为17
时,如果应该是人27
,则会得到人40
的错误答案。谁能告诉我我的循环在哪里弄乱?
源代码:
def solveJosephus(specifics):
people = [int(x) for x in range(1,int(specifics[0])+1)]
killPosition = int(specifics[1])
positionCounter = 0
sorted = False
while not sorted:
if len(people) == 1:
print(people[0]) # Pyschologically scarred Winner!
sorted = True
for person in people:
positionCounter += 1
if positionCounter == killPosition:
print(person)
people.remove(person)
positionCounter = 1
solveJosephus(raw_input().split())
答案 0 :(得分:5)
问题是你在迭代时会从列表中删除人员。
以下是:
假设您有X = 5
和N = 2
。您的列表是[1,2,3,4,5]
。你到了index = 1
,第二个人就死了。现在您的列表是[1,3,4,5]
。问题是你的索引仍然等于1
但现在指向人3.当你再去两个地方(索引= 3),而不是杀死人4时,你会杀死5人。
答案 1 :(得分:1)
我不确定为什么你有时会得到正确或错误的答案,但如果我试图修改列表而在迭代它时作为你的
,我总会遇到奇怪的问题for person in people:
...
people.remove(person)
一样。也许您可以迭代遍历people.copy(),这样您就不会修改您正在迭代的相同列表。
答案 2 :(得分:1)
除了所有other answers(告诉您在迭代时复制列表),您的代码的另一个问题是您将positionCounter
重置为1这一行:positionCounter = 1
。它应该重置为0.这是完整的工作代码(到目前为止工作):
def solveJosephus(specifics):
people = [int(x) for x in range(1,int(specifics[0])+1)]
killPosition = int(specifics[1])
positionCounter = 0
sorted = False
while not sorted:
if len(people) == 1:
print(people[0]) # Pyschologically scarred Winner!
sorted = True
for person in people[:]: #Make copy of iterating list
positionCounter += 1
if positionCounter == killPosition:
print(person)
people.remove(person)
positionCounter = 0 #Important! 0 != 1
solveJosephus(raw_input().split())