Python 我的循环中出了什么问题?
我一直在尝试编程,出于某种原因,它只在某些情况下有效,我不确定为什么。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作为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) 最后,我们只
55
和N作为17
时,我得到了person27
的错误答案,而它应该是person40
。有人能告诉我我的循环哪里出错了吗
源代码:
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())