Почему он не дает правильную сумму первых четных чисел Фибоначчи до 4 млн?

x = 1
y = 2
list = [1,2]
while y< 4000000:
    z= x+y
    x=y
    y=z
    list.append (y)
list_even = []
for a in list:
    if a%2 == 0:
        list_even.append (a)
else:
    pass

total = sum(list_even)
print (total) 
2
Rizz_Beginner_Python 8 Янв 2017 в 19:50

3 ответа

Лучший ответ

Есть и другие ответы, уже посвященные конкретным ошибкам в вашем коде, поэтому я хочу предложить совершенно другую реализацию, которая достигает поставленной цели:

выдает правильную сумму первых четных чисел Фибоначчи до 4 млн.

Если вы хотите найти сумму четных чисел Фибоначчи до некоторого предела, приведенный ниже код может быть более функциональным способом ее достижения. Он основан на создании генераторов Python, которые должны помочь сделать код более легким для понимания и более пригодным для повторного использования.

def fib():
    a, b = 0, 1
    while True:
        yield a
        a, b = b, a + b

def evens(l):
    for x in l:
        if x % 2 == 0:
            yield x

def sum_even_fibonacci(limit):
    total = 0

    for x in evens(fib()):
        if total + x > limit:
            return total

        total += x

if __name__ == '__main__':
    print(sum_even_fibonacci(4000000))

< Сильный > Выход

1089154

< Сильный > Edit

Это неоднозначно, что именно ОП спрашивает.

  • Если ОП хочет суммировать четные условия Фибоначчи до тех пор, пока сумма не превысит 4 000 000 , то ответ будет таким, как я сказал выше - 1089154.

  • Если OP хочет суммировать все четные слагаемые Фибоначчи меньше 4 000 000 , тогда выражение if total + x > limit изменится на x > limit, и ответ будет 4613732.

6
Tagc 8 Янв 2017 в 17:31

Просто для удовольствия, это версия с одним вкладышем

from itertools import takewhile

def fib():
    fk, fk1 = 0,1
    while True:
        yield fk
        fk, fk1 = fk1, fk+fk1

print( sum( x for x in takewhile(lambda f:f<4000000,fib()) if x%2==0 ) )

Здесь takewhile остановит итерацию, когда условие больше не будет удовлетворены так же, как и другие ответы

2
Copperfield 8 Янв 2017 в 17:49

Я распознаю это как проблему 2 в Project Euler. По какой-то причине @Tagc получает неправильный ответ. Я также использовал генератор, но не список. Вот мое решение:

def fibonacci():
    term_0, term_1 = 1,2
    while True:
        yield term_0 + term_1
        term_0, term_1 = term_1, term_0 + term_1

fibonacci_sum = 2
for n in fibonacci():
    if n > 4000000: break
    if n % 2 == 0: fibonacci_sum += n

print(fibonacci_sum)

Выход:

$ python 002.py
4613732
2
Aryaman 8 Янв 2017 в 17:26