试图编写一个能找到Fibonacci序列偶数之和的代码?

时间:2017-11-13 01:27:50

标签: python

我是编程的新手,我正在尝试用Python编写一个程序,它将在Fibonacci序列中找到低于4,000,000的偶数的总和。我不确定我做错了什么但没有打印出来。谢谢你的帮助。

def fib():  
    listx = []  
    for x in range(4000000):  
        if x == 0:  
            return 1
        elif x == 1:
            return 1
        else:
            listx.append(fib(x - 1) + fib(x - 2))
            return listx

def evens(fib):
    y = 0
    for x in fib():
        if x % 2 == 0:
            y += x
        else:
            continue
        print (y)

3 个答案:

答案 0 :(得分:1)

这是一种使用生成器将内存使用量降至最低的方法:

def fib_gen(up_to):
    n, m = 0, 1
    while n <= up_to:
        yield n
        n, m = m, n + m

total = 0
for f in fib_gen(4000000):
    if f % 2 == 0:
        total += f

另一种选择:

def fib_gen(up_to, filter):
    n, m = 0, 1
    while n <= up_to:
        if filter(n):
            yield n
        n, m = m, n + m

sum(fib_gen(4000000, lambda f: f % 2 == 0))  # sum of evens
sum(fib_gen(4000000, lambda f: f % 2))       # sum of odds

答案 1 :(得分:0)

首先,您的要求与您提供的代码之间似乎存在争议:-)您的问题文本(可能来自作业或Euler#2)要求......

  

Fibonacci序列中低于4,000,000的偶数的总和。

您的代码汇总了前四百万斐波那契数字中的偶数,这些数字非常不同。根据比奈的公式,第四百万个斐波那契数字在其中北部有800,000个数字(而不是最高的一个数字中的七个数字低于四百万个)。

因此,假设文本比代码更正确,您实际上并不需要构建列表然后评估其中的每个项目,这在内存上相当浪费。

Fibonacci数字可以在运行中生成,然后只要它们是偶数就可以累积。能够使用任意方法累积数字也更有用,如下所示:

def sumFibWithCond(limit, callback):
    # Set up initial conditions.

    grandparent, parent, child = 0, 0, 1
    accum = 0

    # Loop until number is at or beyond limit.

    while child < limit:
        # Add any suitable number to the accumulator.

        accum = accum + callback(child)

        # Set up next Fibonacci cycle.

        grandparent, parent = parent, child
        child = grandparent + child

    # Return accumulator when done.

    return accum

def accumulateEvens(num):
    # Return even numbers as-is, zero for odd numbers.

    if num % 2 == 0:
        return num
    return 0

sumEvensBelowFourMillion = sumFibWithCond(4000000, accumulateEvens)

特别值得注意的是初始条件。这些数字初始化为0, 0, 1,因为我们要确保检查每个 Fibonacci数(在child中)的累积条件。这意味着child的初始值应该是一个假设,根据问题,这是您想要的第一个数字。

这在当前场景中没有任何区别,因为一个不是偶数,但是,你是否要将累积条件改为&#34;奇数&#34; (或允许一个的任何其他条件),它产生影响。

而且,如果您更愿意订阅以零开头的斐波纳契序列,则起始值应为0, 1, 0

答案 2 :(得分:-1)

也许这会对你有帮助。

def sumOfEvenFibs():
    # a,b,c in the Fibonacci sequence
    a = 1
    b = 1
    result = 0
    while b < 4000000:
        if b % 2 == 0:
            result += b
        c = a + b
        a = b 
        b = c
    return result