不超过一百万的斐波那契数之和
我刚开始做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_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
在这里,我检查了列表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)