我是Python的新手,正在通过edX学习并尝试解决ProjectEuler数学问题。第二个问题是求和小于4,000,000的所有偶数斐波纳契数。我可以使用Python解决此问题,但不能以令我满意的方式解决。
首先,我定义了一个fib函数:
def fib(n):
if n == 0:
return 0
elif n == 1:
return 1
else:
return fib(n-1) + fib(n-2)
然后,我能够打印出所有甚至小于4,000,000的斐波那契数:
n = 0
while True:
if fib(n) < 40000000 and fib(n) % 2 == 0:
print(fib(n))
n = n+1
elif fib(n) < 4000000 and fib(n) % 2 != 0:
n = n+1
else:
break
然后,我从打印的内容中手动形成了一个列表,并对列表进行了汇总。问题是我不想这样做。我希望计算机随即形成列表,然后对值进行求和。有人知道我该怎么做吗?谢谢!
答案 0 :(得分:1)
您可以编写一个生成fib数字的生成器,然后在数字小于400万(4e6
)时从中获取:
import itertools
def fib(n):
if n == 0: return 0
elif n == 1: return 1
else: return fib(n-1) + fib(n-2)
# A generator function that lazily produces new fib numbers
def gen_fibs():
n = 1
while True:
yield fib(n)
n += 1
# Take from the generator while n is less than 4 million
fibs = itertools.takewhile(lambda n: n <= 4e6, gen_fibs())
# Keep all the evens
even_fibs = (n for n in fibs if n % 2 == 0)
# Then print the sum of even fibs
print(sum(even_fibs))
也许有一种方法可以手动定义生成器,但这仍然相当整洁。如果range
的0 arity版本产生了一个无限列表,那么我可以将第一部分简化为一个生成器表达式,但这就是生命。