2011-06-30 22 views
1

我一直在努力工程欧拉问题,尝试和学习python,我写了第二个问题的解决方案(找到斐波那契序列中的偶值项的总和,不超过四百万)。该代码给了我正确的解决方案,但它需要我使用模分裂两次,以从我生成的斐波那契数列表中删除奇数值。这是我写的解决方案:使用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循环两次以删除所有奇数条件?

回答

3

我想象你正面临的问题是,你正试图从列表中删除项目,同时迭代列表。

请参阅here,herehere关于同一主题的以前的问题。

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

你可以做什么不同的事情,导致你不需要在迭代时从列表中删除项目?我不确定你是否希望直接或间接地得到答案,因为你正在做欧拉计划,所以我不会发表任何明显的答案。

1

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

0

不难看出,斐波纳契数列的每一个第三项都是偶数。你可以用它来代替。

在任何情况下,当迭代它时,您都会遇到突变序列的the classic trap。不要这样做,这样做:

fibonacci_list[:] = [x for x in fibonacci_list if x%2==0] 
+1

你可以做fibonacci_list = [X在fibonacci_list X如果x%2 == 0],因为列表解析创建无论如何,新的列表。 –

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 

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

0

这记得我的Eratosthenes筛。所以,我想提出这样的解决方案,假设你的列表转换为array

fibonacci_list = fibonacci_list [ fibonacci_list % 2 != 0 ]