我正在尝试做项目欧拉问题#2。这是:
Fibonacci序列中的每个新术语都是通过添加前两个来生成的 条款。从1和2开始,前10个术语将是:
1,2,3,5,8,13,21,34,55,89,......
考虑Fibonacci序列中其值不超过的项 四百万,找到偶数值的总和。
但是当我使用4000000的以下代码时,终端窗口会挂起。较小的数字运行正常。有没有关于这段代码的东西真的效率低下,因此是懒散的?
n = int(raw_input("Enter the start number: "))
def fib_generator():
a, b = 0, 1
yield 0
while True:
a, b = b, a + b
yield a
def even_sum(fib_seq):
seq = []
seq = [next(fib_seq) for number in range(n)]
seq = [number for number in seq if number % 2 == 0]
return sum(seq)
def start():
fib = fib_generator()
even_sum = even_sum(fib)
print even_sum
start()
答案 0 :(得分:4)
你有一个错误。您正在生成前4,000,000个Fibonacci数字,但问题陈述仅询问那些值不超过4,000,000的Fibonacci数字。
由于Fibonacci数呈指数增长(F n ~1.618 n ),因此您生成的数字具有非常多的数字(log 10 F n ~n / 5)这将花费大量时间。
修复错误,你会没事的。
答案 1 :(得分:2)
当下一个斐波纳契数超过4000000时,你只需要添加逻辑来停止。
另外,我在这条线上窥探了一个潜在的问题:
def start():
fib = fib_generator()
even_sum = even_sum(fib) #<--- right here
print even_sum
变量名称与函数名称相同是不好的。
答案 2 :(得分:0)
是的,您的代码中存在效率低下的问题,您使用两个seq = ...
语句将一个非常长的列表加载到内存中两次。为什么不尝试一个生成器表达式而不是两个列表推导?此外,您可以将Fibonacci生成器更改为停在某个数字处:
def fib_generator(n):
a, b = 0, 1
while a < n:
yield a
a, b = b, a + b
def even_sum(fib_seq):
seq = (number for number in fib_seq if not number % 2)
return sum(seq)
def start():
n = int(raw_input('Enter max constraint: '))
fib_seq = fib_generator(n)
even_sum1 = even_sum(fib_seq)
print even_sum1
start()
答案 3 :(得分:0)
这对我来说非常快
lst = []
num1 = 1
num2 = 2
sum = 0
jump = 0
next = 0
while next<4000000:
next = num1 + num2
if next<4000000:
if jump ==0:
num1 = next
jump = 1
else:
num2 = next
jump = 0
if next%2 == 0:
lst.append(next)
for item in lst:
sum+=item
print ''
print "Sum: ",
print sum