我正在编写用于在Fibonacci序列中查找偶数项的总和的代码,其值不超过四百万。代码适用于高达40k的值但是我找到了一个内存错误,因为找到多达400万可以有人帮我解决问题
我的代码是:
def fib(x):
l=[0,1]
m=[]
a=0
c=0
b=1
while len(l) <=x:
d=c+b
c=b
b=d
l.append(d)
if d%2==0:
m.append(d)
a=a+d
print
print a
print m
答案 0 :(得分:1)
只是为了澄清我的理解:你正在寻找一个函数,它返回斐波那契数列中所有偶数的总和,最多可达400万。尝试使用两个单独的函数。
斐波纳契序列中给定数字的第一个函数:
def fib(n):
a = 0
b = 1
for e in range(n):
old_a = a
a = b
b = old_a + b
return a
第二个函数,用于调用前面的函数(并使用计数,而不是列表,以便节省内存。):
def even_sum(t):
total = 0
for x in range(t):
fib_x = fib(x)
if fib_x % 2 == 0:
total += fib_x
print fib_x # <-- this line is optional,
# include it if you want to see each
# even number printed.
return total
然后调用你的函数。例如:
print even_sum(100)
给了我们这个答案:
286573922006908542050
答案 1 :(得分:0)
试试这个:
def sum_fib(x):
a = 0
c = 0
b = 1
l = 2
while l <=x:
d = c + b
c = b
b = d
l += 1
# yoda conditions check
if 0 == d % 2: # using binary should be faster (0 == d & 1)
a += d
print
print a
答案 2 :(得分:0)
如评论中所述,用计数器替换l。如果你需要打印所有偶数的fib数,请保留m,否则将它们全部一起删除。
初始化计数
count = 2
每次围绕while循环增加计数1.
答案 3 :(得分:0)
这是一个消除不必要列表的版本,正如我在评论中所描述的那样。请注意,您仍然会有一个指数增长的总和,这是不可避免的:
def fib(x):
lc=2
mc=0
a=0
c=0
b=1
while lc <=x:
d=c+b
c=b
b=d
lc += 1
if d%2==0:
mc += 1
a += d
print
print a
print mc