Python 试图写一个代码来找出斐波那契序列的偶数之和?

Python 试图写一个代码来找出斐波那契序列的偶数之和?,python,Python,我是编程新手,我正试图用Python编写一个程序,在斐波那契数列中找到低于4000000的偶数之和。我不确定我做错了什么,但什么都不会打印出来。谢谢你的帮助 def fib(): listx = [] for x in range(4000000): if x == 0: return 1 elif x == 1: return 1 else:

我是编程新手,我正试图用Python编写一个程序,在斐波那契数列中找到低于4000000的偶数之和。我不确定我做错了什么,但什么都不会打印出来。谢谢你的帮助

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)

也许这对你有帮助

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
def sumOfEvenFibs():
#斐波那契序列中的a,b,c
a=1
b=1
结果=0
而b<4000000:
如果b%2==0:
结果+=b
c=a+b
a=b
b=c
返回结果

首先,您的需求和您交付的代码之间似乎存在一些争议:-)您的问题文本(可能来自作业或Euler#2)要求

斐波那契数列中低于4000000的偶数之和

您的代码是对前400万个斐波那契数的偶数求和,这两个数相差很大。根据比内特的公式,第四百万个斐波那契数以北有800000个数字(而最高的数字在四百万以下有七个数字)

因此,假设文本比代码更正确,实际上不需要构建一个列表,然后对其中的每个项目进行求值,这相当浪费内存

斐波那契数可以动态生成,如果它们是偶数,就可以简单地累加。能够使用任意方法来累积数字也更有用,如下所示:

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)
def sumFibWithCond(限制,回调):
#设置初始条件。
祖父母、父母、子女=0,0,1
累计=0
#循环,直到数量达到或超过限制。
当儿童<限制:
#向蓄能器添加任何合适的数字。
累计=累计+回调(子项)
#设置下一个斐波那契循环。
祖父母,父母=父母,孩子
孩子=祖父母+孩子
#完成后返回蓄能器。
返回累计
def蓄能阀(数量):
#按原样返回偶数,奇数返回零。
如果num%2==0:
返回数
返回0
sumEvensBelowFourMillion=sumFibWithCond(4000000,累计)
特别值得注意的是初始条件。这些数字被初始化为
0,0,1
,因为我们希望确保检查每个斐波那契数(在
子项中)的累积条件。这意味着
child
的初始值应该是一,根据问题,假设这是您想要的第一个数字

这在当前场景中没有任何区别,因为一个不是偶数,但是,如果您将累加条件更改为“奇数”(或允许奇数的任何其他条件),它将产生区别


而且,如果您希望订阅从零开始的斐波那契序列,则起始值应为
0,1,0

以下是一种使用生成器将内存使用保持在最低限度的方法:

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\u gen(最多):
n、 m=0,1

当你不调用你的函数时。除非您在代码中调用它们,否则什么都不会运行。
range(4000000)
?你会有一个(大的)惊喜…而且,
如果x==1
如果x==0
对于
范围
只能为真一次。其他迭代将进入我认为是递归的尝试。相反,使用模数
%
检查奇数/偶数。@Evert,
范围(4000000)
对于Python3是合适的(事实上它是
print(y)
而不是
print y
似乎表明这是正在使用的版本),这给了您一个惰性迭代器,而不是一个具体的集合。真正的问题是用它来构造一个列表,而不仅仅是处理值。@paxdiablo我的评论是关于计算3999999斐波那契数(或低于此数的许多数)的想法。更好的是,你不需要将每个数除以2;你可以简单地每三个数字返回一次:1,1,2,3,5,8,13,21,34,@chepner,这对于非常具体的情况来说是很好的,但是现在的代码适应性更强,这意味着像每三个数字这样的技巧是不可靠的。为了澄清,OEIS说
0
是Fibonacci数的第一个,这是奇数相加。
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