我的循环内部出了什么问题?

时间:2015-04-29 01:29:36

标签: python python-2.7 loops

我一直试图对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())

3 个答案:

答案 0 :(得分:5)

问题是你在迭代时会从列表中删除人员。

以下是:

假设您有X = 5N = 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())