我为 Project Euler 的问题 2 编写了部分解决方案,但我很难理解如何对生成的数字求和

I wrote a partial soluton to Problem 2 of Project Euler, but I'm having a difficult time understanding how to sum the generated numbers

欧拉计划第2题,你需要将斐波那契数列中的所有偶数相加,直到4,000,000。我编写的代码仅生成斐波那契数列的偶数,最多为 4,000,000,但我似乎无法弄清楚如何对它们求和。

我已经尝试过将数字附加到列表然后对它们求和,这会引发错误。我已经尝试实现诸如 sum =+ fibonacci(i) 之类的代码,它也会引发相同的错误。注意:我是 Python 的新手,而且我还在学习,如果这看起来很菜鸟,我深表歉意。我搜索了 Whosebug 并发现了一些类似的问题,但答案是与我正在尝试的完全相反的代码 and/or 有些答案有缺陷,这就是我发布问题的原因。 在 if fibonacci(i) % 2 == 0: 之后,我不知道该做什么,我已经为此工作了将近一个小时。

def fibonacci(n):    
    if n == 0:
        return 0
    elif n == 1:
        return 1
    else:
        return fibonacci(n-1)+fibonacci(n-2)
answer = 0
for i in range(0, 10):
    x = fibonacci(i)
    if x % 2 == 0:
    answer =+ x
print(answer)

我似乎无法理解如何在不出现错误的情况下对这些数字求和:"int is not an iterable object." 代码应该打印出斐波那契数列中所有偶数的总和,直到 4,000,000,然后打印出结果。 注意:我知道使用 sum 作为变量是阴影...我使用它只是因为另一个 Whosebug 解决方案推荐了它(它被大力支持),所以请不要关注这个作为问题是因为这不是问题。即使我将 sum 换成另一个随机变量,例如 x,也会抛出相同的错误。

为什么不在生成偶数时求和而不是创建一个中间列表:

def sumEvenFibo(N):
    total = 0
    a,b = 2,3
    for _ in range(N//3):
        total += a # print(a) if you want to see which numbers are added
        a,b = a+2*b,2*a+3*b
    return total

获得第 4,000,000 个斐波那契数的偶数总和大约需要 5 分钟(2.9 GHz Intel Core i9 笔记本电脑)。如果只想要1到4,000,000之间的偶数斐波那契数之和,这应该足够快了(0.11毫秒)

编辑优化版本:

此优化版本在 8 秒内生成前 4,000,000 个偶数斐波那契数的总和。

或者 2.6 秒,如果您只是从前 4M 个斐波那契数中寻找偶数的总和

如果您要查找 1 到 4,000,000 范围内的偶数斐波那契数之和,则为 0.024 毫秒。 (只有 34 个斐诺巴契数,其中只有 11 个是偶数)

# Function to return the Nth, Nth+1 Fibonacci number in log(N) time

def binFibo(N):
    a,b   = 1,1
    f0,f1 = 0,1
    r,s   = (1,1) if N&1 else (0,1)
    N   //=2
    while N > 0:
        a,b   = f0*a+f1*b, f0*b+f1*(a+b)
        f0,f1 = b-a,a
        if N&1: r,s = f0*r+f1*s, f0*s+f1*(r+s)
        N //= 2        
    return r,s

# Function to return the Nth, Nth+1 Even Fibonacci number in log(N) time
def binEvenFibo(N):
    a,b = binFibo(3*N)
    return a,a+2*b

# function to return the sum of the first N even Fibonacci numbers
# Log(N)^2 time
#
def binSumEvenFibo(N,rec=False):
    if N < 2: return [(0,2),(2,8)][N] if rec else [0,2][N]
    m     = N//2
    f0,f1 = binEvenFibo(m-1)
    p0,p1 = f0//2,f1//2
    a,b   = binSumEvenFibo(m,True)
    r     =  a + p0*a+p1*b
    s     =  b + p0*b+p1*(a+4*b)
    if N&1:
        d0,d1 = binEvenFibo(N)
        r,s = r+d0, s+d1
    return (r,s) if rec else r

使用示例:

binSumEvenFibo(100) # sum of the first 100 even fibonacci numbers

# 290905784918002003245752779317049533129517076702883498623284700

错误 "int is not an iterable object" 是由于 sum 函数在需要可迭代对象(例如列表)时将数字传递给该函数引起的。

按照您的代码,您可以继续将所有斐波那契数添加到一个变量中:

result = 0
for i in range(0, 10):
    f_i = fibonacci(i)
    if f_i % 2 == 0:
        result += f_i
print(result)

或将其附加到列表并使用 sum 函数:

even_numbers = []
for i in range(0, 10):
    f_i = fibonacci(i)
    if f_i % 2 == 0:
        even_numbers.append(f_i)
print(sum(even_numbers))