Python 我的循环中出了什么问题?

Python 我的循环中出了什么问题?,python,python-2.7,loops,Python,Python 2.7,Loops,我一直在尝试编程,出于某种原因,它只在某些情况下有效,我不确定为什么。TL;其工作原理如下: 你有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 第三轮:(1)、4、5、(8)、10 第四轮:4,(5),10 第五轮:4,(10) 最后,我们只

我一直在尝试编程,出于某种原因,它只在某些情况下有效,我不确定为什么。TL;其工作原理如下:

你有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

第三轮:(1)、4、5、(8)、10

第四轮:4,(5),10

第五轮:4,(10)

最后,我们只剩下第四个人作为唯一的幸存者

我的程序做得非常好。但是,当我输入X作为
55
和N作为
17
时,我得到了person
27
的错误答案,而它应该是person
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())

我不知道为什么你有时会得到正确或错误的答案,但如果我试图修改一个列表,同时将其作为你的目标进行迭代,我总是会遇到奇怪的问题

for person in people:
    ...
    people.remove(person)

是的。也许您可以迭代people.copy(),这样您就不会修改正在迭代的同一个列表。

问题是,您在迭代列表时正在从列表中删除人员

发生的情况如下:

假设你有
X=5
N=2
。您的列表是
[1,2,3,4,5]
。你到达
index=1
,第二个人就死了。现在您的列表是
[1,3,4,5]
。问题是你的索引仍然等于
1
,但现在它指向了第三个人。当你再去两个地方(index=3)时,不是杀死第4个人,而是杀死第5个人。

除了所有的(告诉你在迭代时复制列表)之外,代码的另一个问题是你在这一行中将
位置计数器
重置为1:
位置计数器=1
。应将其重置为0。以下是完整的工作代码(到目前为止有效):


它应该是
people=range(1,int(specifics[0])+1)
。Python2.x中内置的
range
函数保证生成一个int列表,因此再次将它们映射到int是多余的,我相信,通过迭代OrderedSet的副本并从中删除元素,可以达到更好的时间复杂度:或者只使用内置Python集并迭代从该集合生成的排序列表,例如,
用于排序中的人(幸存者):
这里还可以找到一个递归关系,它可以产生一个有效的动态规划解决方案。最有效的解决方案可能使用一个数学公式:)
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())