将所有偶数斐波那契数相加

时间:2019-08-26 00:21:54

标签: python

我正在尝试将所有偶数斐波那契数加起来不超过4000000。我已经成功输出了所有斐波那契数不超过4000000,但是添加所有偶数对我来说是个问题。到目前为止,这是我尝试过的:

fibonacci = [1, 2]
i = 0
while fibonacci[-1] < 4000000:
    fib = fibonacci[-1] + fibonacci[-2]
    fibonacci.append(fib)
    i += 1
del fibonacci[-1]

result = 0
for x in fibonacci:
    if fibonacci[x] % 2 == 0:
        result += fibonacci[x]
print(result)

它输出一个错误:

  

IndexError:列表索引超出范围

3 个答案:

答案 0 :(得分:3)

在行中:

for x in fibonacci:
    if fibonacci[x] % 2 == 0:
        result += fibonacci[x]

x实际上是斐波那契数本身,而不是索引,并且保证位于fibonacci列表的范围之外。如果代码为for x in range(len(fibonacci)):,则索引将为x

将其更改为:

for x in fibonacci:
    if x % 2 == 0:
        result += x

或更妙的是,使用列表理解:

result = sum(x for x in fibonacci if x % 2 == 0)
print(result)

此外,您可以在生成斐波那契数时在现场累积总和,而不是构建整个列表,这样可以大大提高内存效率:

def even_fib_sum(n):
    total = 0
    a = 0
    b = 1

    while a < n:
        if a % 2 == 0:
            total += a 

        a, b = a + b, a

    return total

if __name__ == "__main__":
    print(even_fib_sum(55))

或者更好的是,您可以使用生成器并放下even,因为fib更可重用:

def fib(n):
    a = 0
    b = 1

    while a < n:
        yield a
        a, b = a + b, a

if __name__ == "__main__":
    print(sum(x for x in fib(4000000) if x % 2 == 0))

请注意,斐波那契数列通常以0、1、1、2、3、5 ...开头,而不是1、2、3、5 ...,但您可以根据需要进行调整,以及是否要迭代是否包含n

答案 1 :(得分:0)

以前的答案的小汇编

fibonacci = [0, 1]
while fibonacci[-1] + fibonacci[-2] < 4000000:
    fibonacci.append(fibonacci[-1] + fibonacci[-2])

print(sum(x for x in fibonacci if x % 2 == 0))

答案 2 :(得分:0)

这就是我初学者写作的方式。

#By considering the terms in the Fibonacci sequence whose values do 
#not exceed four million, 
#find the sum of the even-valued terms.
cache = {}
def fib(n):
    if n < 3:
        return 1
    elif n in cache:
        return cache[n]
    else:
        value =  fib(n - 1) + fib(n - 2)
        cache[n] = value
        return value
tot = 0
for n in range(1, 34):
    if fib(n) % 2 == 0:
        tot += fib(n)
        print(n, ':', fib(n))
print(tot)
相关问题