2015-12-08 3 views
1

Я писал код для нахождения суммы четных членов в последовательности Фибоначчи, значения которых не превышают четырех миллионов. Код работает отлично для значений до 40 К. Но я получил ошибка памяти для поиска Шифрование до 4 миллионов кто-то может помочь мне решить эту проблемуОшибка памяти для кода, чтобы найти сумму чисел четных чисел Фибоначчи в python

мой код:

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

Заменить 'l'' 'lc', длиной' l'. Инициализируйте его до 2. Замените 'len (l)' на 'lc'. Замените 'l.append (d)' на 'l + = 1'. Вы можете сделать то же самое с '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, иначе удалите все вместе.

Initialize подсчитывать

count = 2 

И каждый раз, когда вокруг в то время подсчета приращения цикла на 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

Просто чтобы уточнить, как я понимаю: Вы ищете функцию, которая возвращает сумму всех четных чисел Фибоначчей последовательность, до 4 миллионов. Попробуйте сделать это с помощью двух отдельных функций.

Первая функция для заданного числа в последовательности Фибоначчи:

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

Смежные вопросы