• Проект Эйлера. Задача №2. Как решить правильно?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    ВНИМАНИЕ! Это неправильное решение!
    Это сумма четных по счету элементов ряда фиббоначчи.
    a = 1
    b = 2
    s = b
    while b < 4*10**6:
        a = a + b
        b = a + b
        s += b
    
    print(s)

    А если четные (по значению) элементы складывать, то нужно так:
    s, a, b = 0, 1, 2
    while b < 4*10**6:
        if b % 2 == 0:
            s += b
        a, b = b, a + b   
    
    print(s)

    А ваше решение из вопроса неэффективно. Оно сначала строит список из всех элементов ряда, не превышающих заданного. Потом фильтрует их по четности, благо лениво и не требуется лишней памяти. Ну и суммирует фильтрат. Итого у этого алгоритма O(2*N) сложность по памяти и по столько же по операциям.
    Предложенный выше алгоритм -- O(1) по памяти и O(N) по операциям.

    И на старуху бывает проруха. Ага. невнимательность.
    Ответ написан
    Комментировать