斐波那契低于4百万

Mah*_*led 4 python sequence

可能重复:
Python程序找到斐波那契系列.更多Pythonic方式.

嘿,我正在尝试编写一个脚本,该脚本总结了"斐波那契序列"中的所有偶数项,低于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)

我希望这表明函数式编程方法并不困难,并且是解决某些类型问题的更优雅的方法.