Python 旁路条件
有人能理解为什么下面的代码失败吗Python 旁路条件,python,python-3.x,if-statement,while-loop,Python,Python 3.x,If Statement,While Loop,有人能理解为什么下面的代码失败吗 def main(A): A.sort() B = A[:] ll = len(B) while ll > 1: for i in range(ll): for n in range(i + 1, ll): if (B[i] + B[n]) % 2 == 0: B.remove(B[n])
def main(A):
A.sort()
B = A[:]
ll = len(B)
while ll > 1:
for i in range(ll):
for n in range(i + 1, ll):
if (B[i] + B[n]) % 2 == 0:
B.remove(B[n])
B.remove(B[i])
main(B)
return B
if __name__ == '__main__':
result = main([4, 5, 3, 7, 2])
print(result)
它运行ok,直到我的列表只有一个值,到达“returnB”语句,然后再次跳回循环。我遗漏了什么?您正在使用递归,在循环中再次调用
main(B)
。当递归调用返回时,调用它的循环将继续
此外,您将忽略递归调用的返回值。由于在每次调用main()
时都使用列表的副本,因此忽略返回值意味着放弃递归调用所做的所有工作
最后但并非最不重要的一点是,您正在从B
中删除元素;循环将遇到索引错误,因为i
和n
的范围都是ll
,删除元素后该长度不再有效。由于您无法更新正在循环的range()
对象;您必须使用while
循环来测试每次迭代的长度:
i = 0
while i < len(B):
n = i + 1
while n < len(B):
if (B[i] + B[n]) % 2 == 0:
del B[n], B[i]
break
else:
n += 1
else:
i += 1
您正在递归,调用
main(B)
并忽略返回值。由于您每次都要复制a
,因此忽略返回值很重要。我在回答中列举了几个原因,说明您的代码可能会“失败”。要获得更详细的答案,包括找到有效解决方案的任何机会,请在您的问题中包含适当的答案;错误和预期结果的完整回溯,即函数应该做什么。非常好的洞察力。谢谢Martijn Pieters。在代码“忽略”返回值并再次跳入循环之前,我没有索引错误。再次感谢您的帮助。@Vagelisprokopou:那只是因为您还没有达到外部循环中的索引错误条件。它也会到达那里。
>>> def main(A):
... B = sorted(A)
... i = 0
... while i < len(B):
... n = i + 1
... while n < len(B):
... if (B[i] + B[n]) % 2 == 0:
... del B[n], B[i]
... break
... else:
... n += 1
... else:
... i += 1
... return B
...
>>> main([4, 5, 3, 7, 2])
[7]