2015-12-08 49 views
1

我正在編寫代碼,用於查找斐波那契數列中值不超過四百萬的偶數值項的和。代碼適用於值高達40k的罰款但我得到了尋找高達400萬內存錯誤誰能幫我解決這個問題代碼的內存錯誤在python中找到Even Fibonacci數的總和

我的代碼是:

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 
+1

那麼,你想創建這麼長的名單。爲什麼不完全擺脫'l'和'm',而只是讓櫃檯保持多久?那麼你幾乎不會使用任何內存。 –

+0

刪除l和m後如何使用計數器 –

+0

用'lc'替換'l','l'的長度。將其初始化爲2.將'len(l)'替換爲'lc'。用'l + = 1'替換'l.append(d)'。你可以用'm'來完成,初始化爲0. –

回答

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 
+0

非常感謝#Nikos M.這個效果很好 –

0

正如評論說:用計數器替換l。如果你需要打印所有的均勻纖維數保持m否則一起刪除它。

初始化計數

count = 2 

和周圍的while循環增量次數,每次按1

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 
+0

謝謝#Tom Karzes這個效果很好 –

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