不超过一百万的斐波那契数之和

-2 投票
3 回答
665 浏览
提问于 2025-04-17 17:31

我刚开始做Project Euler的第二个问题,想问一下有没有人能帮我修复这个脚本:

def fib():
    x,y = 0,1
    while True:
        yield x
        x,y = y, x+y

def even(seq):
    for number in seq:
        if not number % 2:
            yield number

def under_a_million(seq):
    for number in seq:
        if number > 4000000:
            break
        yield number   

print sum(even(under_a_million(fib())))

这段代码的目的是找出所有小于一百万的斐波那契数的总和。现在我在第7行遇到了一些问题。

3 个回答

1

下面是我为欧拉2挑战写的一个简单函数。在Python 3.0中,我希望它能给大家一些启发。

def sum_even_fib(n):#n is the upper_limit value for item in fib list
    list_numbers=[]
    a,b=0,1#initializing
    while b<n:#exits if condition fail
        list_numbers.append(b)
        a,b=b,a+b
    even_fib =[i for i in list_numbers if i%2==0]
    result=sum(even_fib)
    return result
1

你的代码运行得很好。
至少在我修改之后的版本是这样。

如果你的代码出现错误,可能是因为缩进不正确吧?我运行这段代码没有问题。

请注意,问题是“斐波那契数列中不超过四百万的值,找出偶数项的和”。

所以

def fib():
    x,y = 0,1
    while True:
        yield x
        x,y = y, x+y

def even(seq):
    for number in seq:
        if not number % 2:
            yield number

def under_a_million(seq):
    for number in seq:
        if number > 4000000: # <------------
            break
        yield number   

print sum(even(under_a_million(fib())))

顺便说一下,看到使用生成器真不错。这几乎就像是Haskell中的懒惰求值 :)

1

你好,Seamonkey,欢迎来到Stack Overflow。我很高兴你这次在问题上花了更多的心思,比上次好多了 :)

我会一步一步带你走过这段代码。对于简单的问题,我发现不使用函数会更容易,因为处理全局变量时,函数可能会让人觉得麻烦。

#This part of the code gets the entire fibonacci sequence
list_of_numbers = []
even_fibs = []
x,y = 0,1 #sets x to 0, y to 1
while y <= 4000000: #Gets numbers till 4 million
    list_of_numbers.append(y)
    x, y = y, x+y #updates the fib sequence

在这段代码中(如果你愿意,可以把它改成函数),我们计算了完整的斐波那契数列,直到400万。我们还创建了两个列表,list_of_numberseven_fibs。第一个列表用来存储完整的数列,第二个列表用来存储偶数。接下来我们看下一段代码。

coord = 0
for number in range(len(list_of_numbers)):
    test_number = list_of_numbers [coord]

    if (test_number % 2) == 0:
        even_fibs.append(test_number)
    coord+=1

在这里,我检查了列表list_of_numbers中的数字是否是偶数。如果是偶数,我就把它们添加到even_fibs列表中。你可以在这里了解更多关于列表的内容。

print "Normal:  ", list_of_numbers #outputs full sequence
print "\nEven Numbers: ", even_fibs #outputs even numbers
print "\nSum of Even Numbers:  ", sum(even_fibs) #outputs the sum of even numbers

这段代码只是输出我们的结果。


因为你似乎喜欢使用函数,所以我在这里添加了代码。解释和上面的一样。

#This part of the code gets the entire fibonacci sequence
list_of_numbers = []
even_fibs = []

def fib(list_of_numbers):

    x,y = 0,1 #sets x to 0, y to 1
    while x+y <= 4000000: #Gets numbers till 4 million
        list_of_numbers.append(y)
        x, y = y, x+y #updates the fib sequence
    return list_of_numbers

def even(list_of_numbers, even_fibs):
    coord = 0
    for number in range(len(list_of_numbers)):
        test_number = list_of_numbers [coord]

        if (test_number % 2) == 0:
            even_fibs.append(test_number)
        coord+=1
    return even_fibs

fib(list_of_numbers) #call fib function

even(list_of_numbers, even_fibs) #Call the even function
#Output
print "Normal:  ", list_of_numbers
print "\nEven Numbers: ", even_fibs
print "\nSum of Even Numbers:  ", sum(even_fibs)

撰写回答