甚至斐波纳契数的总和< X

时间:2016-01-03 23:03:56

标签: python fibonacci

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

这就是我所拥有的。

#!/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的Fibonacci序列,如下所示,您将看到下面的结果。

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。为什么这样?

5 个答案:

答案 0 :(得分:3)

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

你只需要循环直到你击中了一个> 400000不是你的代码试图做的第400万个斐波纳契数,你可以简化为使用生成函数和sum,只有产生偶数并且在你点击斐波那契数时打破循环> 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)几分钟后仍在运行。

答案 1 :(得分:1)

使用for counter in range(0, limit)你的函数中有'限制'迭代。例如,如果你的'limit'变量是10,你将不会得到甚至小于10的fibonachi数字的总和,但你将得到前10个fibonachi数字的总和。

为了让您的代码正常运行,您需要按for counter in range(0, limit)重新设置while last < limit,每当您发现最后一个是偶数时,您将其添加到总数中。

答案 2 :(得分:1)

您可以稍微清理一下该生成函数。我就是这样写的。

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的所有Fibonacci数字(我们在这里应该更加小心,因为我们将返回前两个数字,无论如何)。

然后我们就可以了

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

答案 3 :(得分:1)

您应该将代码更改为仅生成数字,而不是总和或仅更改返回的yield,并删除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

print even_fib_sums(5)

答案 4 :(得分:0)

在第一个代码段中,您总结了整数,而不是仅仅产生数字。如果您希望在第一个代码段中输入10作为5的输入,则应该通过以下任一方式修改代码(不是为了提高效率,只是为了解决问题):

     ...
     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)