这个代码在Python中的偶数fibonacci序列有什么问题?

时间:2015-07-10 17:10:39

标签: python function loops while-loop fibonacci

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课程。

4 个答案:

答案 0 :(得分:0)

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

您可能希望始终计算下一个Fibonacci数,但只有在second为偶数时才增加计数。

答案 1 :(得分:0)

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

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

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

答案 2 :(得分:0)

由于这是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

答案 3 :(得分:0)

在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()