【问题标题】:Why no answer when trying to sum even Fibonacci numbers为什么尝试对斐波那契数求和时没有答案
【发布时间】:2018-11-18 13:38:18
【问题描述】:

我定义了一个计算斐波那契数的函数,效果很好。

现在我正在尝试将所有偶数斐波那契数

def fib_iterative(n):
    a, b = 0, 1
    for i in range(0, n):
        a, b = b, a + b
    return a

def sum_even_fibs(n):
    total = 0
    n = 0
    while fib_iterative(n) < 4000000:
        if fib_iterative(n) % 2 == 0:
            total += fib_iterative(n)
            n += 1
    return total

print(sum_even_fibs(10))
# 1,1,2,3,5,8,13,21,34,55. 
# 2 + 8 + 34 = 44

【问题讨论】:

  • 备注:odd+odd=even 和 even+odd=odd,因此偶数斐波那契数适用于 n%3 == 2。

标签: python-3.x while-loop fibonacci


【解决方案1】:

您的代码不起作用,因为您直到n 才执行此操作,直到4000000 才执行此操作。

你可以结合你的两个函数来创建它。

def sum_even_fibs(n):
    a, b = 0, 1
    t = 0
    for i in range(n):
        a, b = b, a + b
        if a % 2 == 0:
            t += a
    return t

print(sum_even_fibs(10)) #44

正如 cmets 中的某个人指出的那样,每三个数字都是偶数,因此您可以将其压缩到

def sum_even_fibs(n):
    a, b = 0, 1
    t = 0
    for i in range(n // 3):
        a, b = a + 2 * b, 2 * a + 3 * b
        t += a
    return t

print(sum_even_fibs(10)) #44

对于你不想做任何超过 4000000 的数字的特定情况,你可以添加这个 if 语句

def sum_even_fibs(n):
    a, b = 0, 1
    t = 0
    for i in range(n // 3):
        a, b = a + 2 * b, 2 * a + 3 * b
        if a >= 4000000:
            print("the fibonacci numbers in this calculation exceed 4000000")
            return None
        t += a
    return t

【讨论】:

  • 谢谢!这很好用,但我不知道如何只在
  • @newc00der 如果 n 大于 4000000,您希望函数返回什么?什么都没有?
  • 一条消息指出“此计算中的斐波那契数超过 4000000”
【解决方案2】:

假设您只是在 n=5 之前这样做。你应该计算五个斐波那契数。相反,您正在计算所有斐波那契数,直到当前一个数的三倍!对于每个n,您应该只调用一次fib_iterative 并重复使用结果。您还丢弃了 n 参数的值。

def sum_even_fibs(n):
    total = 0
    for x in range(n):
        current = fib_iterative(x)
        if current > 4000000:
            break
        if not current % 2:
            total += current
    return total

这仍然是低效的,因为您每次调用fib_iterative(n) 时都在重新计算n-1 的值。相反,基于生成器的解决方案将允许您只计算每个值一次。

from itertools import takewhile

def fib(n):
    x = 0
    y = 1
    for _ in range(n):
        yield x
        x, y = y, x+y

def sum_even_fibs(n):
    fibs = fib(n)
    evens = (x for x in fibs if not x%2)
    less_than_4000000 = takewhile(lambda x: x < 4000000, evens)
    return sum(less_than_4000000)

【讨论】:

  • 谢谢!一些我从未见过的东西('itertools'、'takewhile'、'yield'、'lambda')。我会试着绕开他们……
【解决方案3】:

关于代码:

if fib_iterative(n) % 2 == 0:
    total += fib_iterative(n)
    n += 1

如果nth 斐波那契数是偶数,这只会增加n。这意味着,一旦你到达1,它就会变成一个无限循环。如果你在whileif 语句之间立即放置一个print(n),你会看到这个——它会打印出0,然后是相当多的1s(大概直到你感到无聊和强行停止)。

要修复它,您需要将n += 1 缩进一级,以便它无论如何都会递增:

if fib_iterative(n) % 2 == 0:
    total += fib_iterative(n)
n += 1

【讨论】:

    猜你喜欢
    • 2012-12-29
    • 1970-01-01
    • 1970-01-01
    • 2016-07-23
    • 1970-01-01
    • 2021-05-17
    • 1970-01-01
    • 2013-04-26
    • 2011-05-14
    相关资源
    最近更新 更多