1

我一直在研究 Project Euler 问题以尝试学习 python,并且我为第二个问题编写了一个解决方案(在斐波那契数列中找到不超过四百万的偶数项的总和)。该代码为我提供了正确的解决方案,但它要求我使用两次模除法,以便从我生成的斐波那契数列中删除奇数值。这是我写的解决方案:

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 循环来删除所有奇数项?

4

5 回答 5

3

我想您面临的问题是您在迭代列表时试图从列表中删除项目。

有关同一主题的先前问题,请参见此处此处此处

为了便于讨论,我们假设这实际上是问题所在,并且假设禁止在迭代列表时从列表中删除项目。

你可以做些什么不同的事情来让你在迭代列表时不需要从列表中删除项目?我不确定你是否想直接得到答案,因为你正在做欧拉计划,所以我不会给出任何明显的答案。

于 2011-06-30T20:43:27.473 回答
1

只是简单地看了这个,但看起来你正在改变你正在迭代的集合,即当你删除项目时,指向当前项目/下一个项目的指针将受到影响,并且某些项目可能会在第一次通过时被跳过。

于 2011-06-30T20:43:30.293 回答
0

不难看出,只有斐波那契数列的第三项是偶数。你可以改用它。

在任何情况下,您都陷入了在迭代序列时改变序列的经典陷阱。不要那样做,这样做:

fibonacci_list[:] = [x for x in fibonacci_list if x%2==0]
于 2011-06-30T20:44:30.547 回答
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

我不明白你为什么没有必要从列表中删除奇数条目。只需添加偶数的就可以了。

于 2011-06-30T20:58:37.893 回答
0

这让我想起了埃拉托色尼的筛子。所以我想提出这个解决方案,假设将您的列表转换为array

fibonacci_list = fibonacci_list [ fibonacci_list % 2 != 0  ]
于 2012-12-01T20:25:50.470 回答