Автоматически созданный список из печатных объектов - PullRequest
0 голосов
/ 26 августа 2018

Я новичок в Python и учусь через edX и пытаюсь решить математические задачи ProjectEuler. Вторая проблема заключается в суммировании всех четных чисел Фибоначчи, которые меньше, чем 4 000 000. Я смог решить эту проблему с помощью Python, но не таким способом, который меня устраивал.

Сначала я определил функцию fib:

def fib(n):
if n == 0:
    return 0
elif n == 1:
    return 1
else:
    return fib(n-1) + fib(n-2)

Затем я смог напечатать все четные числа Фибоначчи со значением менее 4 000 000:

n = 0
while True:
if fib(n) < 40000000 and fib(n) % 2 == 0:
    print(fib(n))
    n = n+1
elif fib(n) < 4000000 and fib(n) % 2 != 0:
    n = n+1
else:
    break

Затем я вручную сформировал список из того, что было напечатано, и суммировал список. Проблема в том, что я не хочу этого делать. Я хочу, чтобы компьютер формировал список по мере поступления, а затем суммировал значение. Кто-нибудь знает, как я могу это сделать? Спасибо!

1 Ответ

0 голосов
/ 26 августа 2018

Вы можете написать генератор, который будет производить числа Фибоначчи, а затем просто взять его, пока число меньше 4 миллионов (4e6):

import itertools

def fib(n):
  if n == 0: return 0
  elif n == 1: return 1
  else: return fib(n-1) + fib(n-2)

# A generator function that lazily produces new fib numbers
def gen_fibs():
  n = 1
  while True:
    yield fib(n) 
    n += 1

# Take from the generator while n is less than 4 million
fibs = itertools.takewhile(lambda n: n <= 4e6, gen_fibs())

# Keep all the evens
even_fibs = (n for n in fibs if n % 2 == 0)

# Then print the sum of even fibs
print(sum(even_fibs)) 

Может быть способ обойти определение генератора вручную, но это все еще довольно изящно. Если бы у range была версия с 0 арностями, которая создавала бесконечный список, я мог бы вместо этого сократить первую часть до выражения генератора, но такова жизнь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...