如何使用Python添加在'while'循环中生成的某些值

时间:2011-12-24 05:23:02

标签: python while-loop fibonacci

我正在解决a Project Euler problem,其内容如下:

  

通过考虑Fibonacci序列中的值不超过四百万的项,找到偶数项的总和。“

所以我使用这个脚本打印斐波那契序列达到四百万:

a = 0
b = 1
while b < 4000000:
    print b
    a, b = b, a+b

显然,我可以运行它,只需手动添加偶数值,但我觉得我在作弊。

从技术上讲,我想我要问两个问题:

  1. 我怎么能挑选出平价?
  2. 如何在不实际将它们分配给变量的情况下添加这些evens?
  3. 哦,我确信它非常明显,但我很新......好吧,编程一般而且我很容易迷失在专家的冗长中。提前致谢!

3 个答案:

答案 0 :(得分:6)

如果您反对变量作业,您可能会喜欢functional approach

>>> from itertools import takewhile, ifilter

>>> def fib():
        a, b = 0, 1
        while True:
            yield a
            a, b = b, a+b

>>> def is_even(x):
        return x % 2 == 0

>>> sum(ifilter(is_even, (takewhile(lambda x: x<4000000, fib()))))
4613732

答案 1 :(得分:2)

啊,Project Euler!

这是一个数学问题,而不是编程问题。

在编程方面,只需添加累加器即可。您可以使用模运算符%来测试均匀度,该运算符在将左操作数除以右操作数后返回整数余数。

a, b = 0, 1
evens = 0
while b < 4000000:
    if not b%2:
        evens += b
    a, b = b, a+b

一旦你得到答案,Project Euler PDF和论坛将填补你这个问题的肮脏部分并真正回答你的问题。有一些方法可以避免必须计算每个Fibonacci数并且必须测试均匀性,但这些方法需要利用Fibonacci序列的特定数学属性。

答案 2 :(得分:1)

  

我怎么能挑出这些平价?

当你将它们除以2(整数)时,偶数是剩下的零。在Python中,我们得到'除以整数'后的余数与%运算符。

然而,你可以在这里做另一个巧妙的伎俩。偶数Fibonacci数是序列中的每三个数,如果你能够严格证明为什么,那么你将接近得到直接生成偶数Fibonacci数序列所需的公式。

  

如何在不实际将它们分配给变量的情况下添加这些evens?

将它们分配给变量有什么问题?只需为运行计数设置另一个。