嘿,我正在尝试编写一个脚本,该脚本总结了"斐波那契序列"中的所有偶数项,低于4百万.
Fibonacci1 = 1
Fibonacci2 = 2
a = 2
i = 4
for i in range(1,4000000):
Fibonacci1 = Fibonacci1 + Fibonacci2
if Fibonacci1 % 2 == 0:
a = a + Fibonacci1
Fibonacci2 = Fibonacci1 + Fibonacci2
if Fibonacci2 % 2 == 0:
a = a + Fibonacci2
print a
raw_input()
Run Code Online (Sandbox Code Playgroud)
它应该不到一分钟,但它花了一整夜,它没有解决!
编辑:对不起伙计们,我误解了这个问题.我虽然这意味着我必须将所有偶数项加起来达到400万!但解决方案是将所有平均值加上400万.
工作代码(在不到一秒的时间内完成):
Fibonacci1 = 1
Fibonacci2 = 2
a = 2
while a < 4000000:
Fibonacci1 = Fibonacci1 + Fibonacci2
if Fibonacci1 % 2 == 0:
a = a + Fibonacci1
Fibonacci2 = Fibonacci1 + Fibonacci2
if Fibonacci2 % 2 == 0:
a = a + Fibonacci2
print a
raw_input()
Run Code Online (Sandbox Code Playgroud)
Mar*_*ers 25
您的代码存在一些问题:
大多数人在开始学习Python时只学习命令式编程.这并不奇怪,因为Python是一种命令式语言.但Python也在一定程度上支持函数式编程,对于这种练习,函数式编程方法在我看来更具启发性.
首先定义一个生成所有Fibonacci数的生成器:
def fib():
a = b = 1
while True:
yield a
a, b = b, a + b
Run Code Online (Sandbox Code Playgroud)
要使用这个生成器,我们可以从itertools导入一些有用的函数.要打印前几个数字,请使用islice:
from itertools import ifilter, islice, takewhile
for x in islice(fib(), 5):
print x
Run Code Online (Sandbox Code Playgroud)
1 1 2 3 5
要仅查找偶数,我们可以使用ifilter生成新的生成器:
def is_even(x):
return x % 2 == 0
evenfibs = ifilter(is_even, fib())
for x in islice(evenfibs, 5):
print x
Run Code Online (Sandbox Code Playgroud)
2 8 34 144 610
要从生成器中获取数字,直到数字超过四百万,请使用takewhile:
for x in takewhile(lambda x: x < 4000000, evenfibs):
print x
Run Code Online (Sandbox Code Playgroud)
要解决此问题,您可以使用sum:
sum(list(takewhile(lambda x: x < 4000000, evenfibs)))
Run Code Online (Sandbox Code Playgroud)
我希望这表明函数式编程方法并不困难,并且是解决某些类型问题的更优雅的方法.
归档时间: |
|
查看次数: |
2931 次 |
最近记录: |