我正在解决a Project Euler problem,其内容如下:
通过考虑Fibonacci序列中的值不超过四百万的项,找到偶数项的总和。“
所以我使用这个脚本打印斐波那契序列达到四百万:
a = 0
b = 1
while b < 4000000:
print b
a, b = b, a+b
显然,我可以运行它,只需手动添加偶数值,但我觉得我在作弊。
从技术上讲,我想我要问两个问题:
哦,我确信它非常明显,但我很新......好吧,编程一般而且我很容易迷失在专家的冗长中。提前致谢!
答案 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)
这是一个数学问题,而不是编程问题。
在编程方面,只需添加累加器即可。您可以使用模运算符%
来测试均匀度,该运算符在将左操作数除以右操作数后返回整数余数。
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?
将它们分配给变量有什么问题?只需为运行计数设置另一个。