【问题标题】:What is wrong with this code for an even-number fibonacci sequence in Python?Python 中偶数斐波那契数列的这段代码有什么问题?
【发布时间】:2015-09-29 13:05:30
【问题描述】:
def fibonacci(n):
    first = 0
    second = 1
    count = 0
    while count <= n:
        if (second % 2 == 0):
            first, second = second, first + second
            count += 1
    return first, second

print (fibonacci(4000000))

有人能解释一下这段代码有什么问题吗?在 IDLE 中,页面重新启动但不返回任何答案。顺便说一句,我是一名初级程序员,刚刚完成 CodeAcademy 课程。

【问题讨论】:

  • 附带说明,在 Python 中,您使用 return first, second 返回 2 个值。
  • 提示:将print(first, second) 放入while 循环中,观察值的变化。
  • “偶数斐波那契数列”是什么意思?它是给定元素之前所有偶数斐波那契数的列表吗?
  • 另外,看起来这可能是Problem 2 from Project Euler。如果是,那么你的算法和对问题的理解是不正确的。
  • 这是欧拉项目。你应该尽可能多地走逻辑捷径:P

标签: python function loops while-loop fibonacci


【解决方案1】:

由于这是针对Problem 2 of Project Euler 的,因此您正在计算错误的值。它要求所有偶数斐波那契数的总和,不超过四百万的 ,而不是百万分之四的值。那太大了。

由于我们想继续生成值,我们将使用生成器并将其与itertools.takewhile() 结合起来。然后我们将filter() 降到偶数,然后找到sum()

import itertools

def fibonacci_gen():
    first = 0
    second = 1
    while 1:
        first, second = second, first + second
        yield second

 

>>> a = fibonacci_gen()
>>> sum(filter(lambda y: not y%2, itertools.takewhile(lambda x: x<=4e6, a)))
4613732

对于不使用这些功能的解决方案:

def fibonacci_4m():
    result = 0
    first = 0
    second = 1
    while second <= 4e6:
        first, second = second, first + second
        if not second%2:
            result += second
    return result

 

>>> fibonacci_4m()
4613732

【讨论】:

  • 非常感谢你是对的,但是我刚刚完成了 CodeAcademy 课程,所以我不熟悉 'yield'、'itertools.takewhile'、filter() 和一些到目前为止的其他语法。能不能简化一下语法?
  • 我强烈建议您改为了解它们。您可以从the relevant question in the "Related" sidebaritertools.takewhilefilter 从我的答案中嵌入的链接中找到有关yield 的信息。
  • Stack Overflow 上的解释看不懂,有没有其他更简单/详细的解释,可以参考一下?
  • @Kor13,我添加了一个使用更多基本操作的替代版本。
【解决方案2】:

在您的 while 循环中,如果 if 语句未能执行其条件代码,则不会发生任何变化。请尝试以下方法:

def main():
    for index in range(1, 41):
        print('even_fibonacci({}) = {}'.format(index, even_fibonacci(index)))

def even_fibonacci(index):
    for number in all_fibonacci():
        if not number & 1:
            index -= 1
            if not index:
                return number

def all_fibonacci():
    a, b = 0, 1
    while True:
        yield a
        a, b = b, a + b

if __name__ == '__main__':
    main()

【讨论】:

    【解决方案3】:

    您的问题是 if 语句中有 count 变量。您已经创建了一个无限的 while 循环。将其移到 if 语句之外:

        if(second % 2 == 0):
            first, second = second, first + second
        count +=1
    

    您还必须添加更多代码才能使其正常工作。

    【讨论】:

      【解决方案4】:

      second % 2 从 1 开始,这并不奇怪。因此,您的 while 循环不会在正文中运行任何内容,因此循环将永远运行。

      您可能希望始终计算下一个斐波那契数,但仅在 second 为偶数时才增加计数。

      【讨论】:

        猜你喜欢
        • 2018-09-09
        • 1970-01-01
        • 1970-01-01
        • 2011-09-30
        • 1970-01-01
        • 1970-01-01
        • 2016-11-21
        • 2021-09-15
        • 2021-12-27
        相关资源
        最近更新 更多