在Python中解决项目Euler#2

时间:2013-07-25 00:58:00

标签: python

我正在尝试做项目欧拉问题#2。这是:

  

Fibonacci序列中的每个新术语都是通过添加前两个来生成的   条款。从1和2开始,前10个术语将是:

     

1,2,3,5,8,13,21,34,55,89,......

     

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

但是当我使用4000000的以下代码时,终端窗口会挂起。较小的数字运行正常。有没有关于这段代码的东西真的效率低下,因此是懒散的?

n = int(raw_input("Enter the start number: "))

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

def even_sum(fib_seq):
    seq = []
    seq = [next(fib_seq) for number in range(n)]
    seq = [number for number in seq if number % 2 == 0]
    return sum(seq)

def start():
    fib = fib_generator()
    even_sum = even_sum(fib)
    print even_sum

start()

4 个答案:

答案 0 :(得分:4)

你有一个错误。您正在生成前4,000,000个Fibonacci数字,但问题陈述仅询问那些不超过4,000,000的Fibonacci数字。

由于Fibonacci数呈指数增长(F n ~1.618 n ),因此您生成的数字具有非常多的数字(log 10 F n ~n / 5)这将花费大量时间。

修复错误,你会没事的。

答案 1 :(得分:2)

当下一个斐波纳契数超过4000000时,你只需要添加逻辑来停止。

另外,我在这条线上窥探了一个潜在的问题:

def start():
    fib = fib_generator()
    even_sum = even_sum(fib) #<--- right here
    print even_sum

变量名称与函数名称相同是不好的。

答案 2 :(得分:0)

是的,您的代码中存在效率低下的问题,您使用两个seq = ...语句将一个非常长的列表加载到内存中两次。为什么不尝试一个生成器表达式而不是两个列表推导?此外,您可以将Fibonacci生成器更改为停在某个数字处:

def fib_generator(n):
    a, b = 0, 1
    while a < n:
        yield a
        a, b = b, a + b

def even_sum(fib_seq):
    seq = (number for number in fib_seq if not number % 2)
    return sum(seq)

def start():
    n = int(raw_input('Enter max constraint: '))
    fib_seq = fib_generator(n)
    even_sum1 = even_sum(fib_seq)
    print even_sum1

start()

答案 3 :(得分:0)

这对我来说非常快

lst = []
num1 = 1
num2 = 2
sum = 0
jump = 0
next = 0

while next<4000000:
    next = num1 + num2
    if next<4000000:
        if jump ==0:
            num1 = next
            jump = 1
        else:
            num2 = next
            jump = 0
        if next%2 == 0:
            lst.append(next)

for item in lst:
    sum+=item

print ''
print "Sum: ",
print sum