我一直在研究项目Euler问题,试图学习python,我写了第二个问题的解决方案(找到Fibonacci序列中偶数值的总和,不超过四百万)。代码给了我正确的解决方案,但它要求我使用模数除法两次,以便从我生成的斐波纳契数列表中删除奇数值。这是我写的解决方案:
term_1 = 1
term_2 = 2
fibonacci_list = [1]
while term_2 < 4000000:
fibonacci_list.append(term_2)
term_1, term_2 = term_2, term_1 + term_2
for num in fibonacci_list:
if num % 2 != 0
fibonacci_list.remove(num)
for num in fibonacci_list:
if num % 2 != 0
fibonacci_list.remove(num)
return sum(fibonacci_list)
如果我只放入一个for循环,则列表fibonacci_list将变为以下内容:
[2, 5, 8, 21, 34, 89, 144, 377, 610, 1597, 2584, 6765, 10946, 28657, 46368, 121393, 196418, 514229, 832040, 2178309, 3524578]
不是所有奇数项都不能通过模数除法测试而被删除吗?为什么我需要运行for循环两次以删除所有奇数编号的术语?
答案 0 :(得分:3)
我想你遇到的问题是你在迭代列表时试图从列表中删除项目。
有关同一主题的先前问题,请参阅here,here和here。
为了便于讨论,我们假设这实际上是问题所在,我们假设在迭代它时禁止从列表中删除项目。
你可以做些什么,这会导致你在迭代时不需要从列表中删除项目?我不确定你是否想要直接给出答案,因为你正在做Project Euler,所以我不会给出任何明显的答案。
答案 1 :(得分:1)
只是简单地看一下,但看起来你正在改变你正在迭代的集合,即当你删除项目时,指向当前项目/下一个项目的指针将受到影响,并且某些项目可能会被跳过通过。
答案 2 :(得分:0)
不难看出,只有斐波纳契序列的每第3个项都是偶数。你可以改用它。
在任何情况下,你都会在迭代它时陷入the classic trap变异序列。不要那样做,这样做:
fibonacci_list[:] = [x for x in fibonacci_list if x%2==0]
答案 3 :(得分:0)
将您的计划与此进行比较。这可能有所帮助。
fibonacci = [1,2]
num = 3
while num < 4000000:
fibonacci.append(num)
len_ = len(fibonacci)
num = fibonacci[len_-2] + fibonacci[len_-1]
sum = 0
for num in fibonacci:
if num%2 == 0: sum += num
print sum
我不明白为什么你不必从列表中删除奇数编号的条目。只需添加偶数编号即可。
答案 4 :(得分:0)
这让我想起了Eratosthenes的筛子。所以我想提出这个解决方案,假设将您的列表转换为array
:
fibonacci_list = fibonacci_list [ fibonacci_list % 2 != 0 ]