偶数斐波那契数之和 < X

Sum of Even Fibonacci Numbers < X

我正在研究这个,我似乎有一个可行的解决方案,但我很难理解它的行为。

这是我的。

#!/usr/bin/python



def even_fib_sums(limit):
    number = 1
    last = 0
    before_last = 0
    total = 0
    for counter in range (0,limit):
     before_last = last
     last = number
     number = before_last + last
     if not number % 2:
        total += number
        yield total

print sum(even_fib_sums(4000000))

我是编程新手,但考虑到我需要循环遍历该范围内的所有 4000000 个数字,这对我来说不是很有效。

如果我使用相同的方法生成最多 5 的斐波那契数列如下所示,您将看到下面的结果。

def generate_fib(limit):
    number = 1
    last = 0
    before_last = 0
    total = 0
    for counter in range (0,limit):
     before_last = last
     last = number
     number = before_last + last
     print number

generate_fib(5)

结果:1,2,3,5,8

在结果中的这些数字中,只有 2 和 8 % 2 == 0。 总和应该是 10,但如果我要使用上面的第一个代码片段,我将返回 12。为什么这样?

通过使用 for counter in range(0, limit),您的函数中有 'limit' 迭代。例如,如果您的 'limit' 变量是 10,您将不会得到小于 10 的偶数斐波那契数之和,但您将得到前 10 个偶数斐波那契数之和。

为了使您的代码正常工作,您需要将 for counter in range(0, limit) 替换为 while last < limit,并且每次发现最后一个是偶数时,将其添加到总数中。

在第一个代码片段中,您计算​​了整数的总和,而不是仅仅得出数字。如果你希望在你的第一个代码片段中输入 5 得到 10,你应该通过以下方式之一修改代码(这里不是试图提高效率,只是为了解决问题):

     ...
     number = before_last + last
     if not number % 2:
        yield number

print sum(even_fib_sums(4000000))

     ...
     number = before_last + last
     if not number % 2:
        total += number
  return total

print even_fib_sums(4000000)

您或许可以稍微清理一下生成函数。我会这样写。

def fib(x):
    a = 1
    b = 1
    yield a
    yield b
    a,b = b,a+b
    while b<=x:
       yield b
       a,b = b,a+b

这将为您提供一个生成函数,它将为您提供所有小于或等于 x 的斐波那契数(我们在这里应该更加小心,因为无论如何我们都会 return 前两个数字).

那我们就可以

sum(x for x in fib(4000000) if x%2==0)

您应该更改您的代码以仅生成数字,而不是总和,或者仅将生成更改为 return,然后像这样删除 sum() keyworkd:

def even_fib_sums(limit):
    number = 1
    last = 0
    before_last = 0
    total = 0
    for counter in range (0,limit):
        before_last = last
        last = number
        number = before_last + last
        if not number % 2:
            total += number
    return total

打印even_fib_sums(5)

考虑斐波那契数列中不超过四百万的项,求even-valued项之和

你只需要循环直到你遇到一个大于 400000 的 fib,而不是你的代码试图做的第 4 百万分之一斐波那契数,你可以简化为使用带有求和的生成器函数,只产生偶数和中断当你击中斐波那契数 > 4000000 时的循环:

def fib(n):
    a, b = 0, 1
    while a <= n:
        a, b = b, a + b
        if not b & 1:
            yield b


print(sum(fib(4000000)))

计算需要几分之一秒:

In [5]: timeit sum(fib(4000000))

100000 loops, best of 3: 6 µs per loop

尝试 timeit even_fib_sums(4000000) 几分钟后仍然 运行。