Различные методы генерации чисел Фибоначчи с использованием цикла for

«Цикл Фибоначчи по циклу for» — это просьба объяснить различные методы генерации чисел Фибоначчи с использованием цикла for. Вот несколько подходов:

Метод 1: базовая итерация

def fibonacci(n):
    if n <= 0:
        return []
    elif n == 1:
        return [0]
    elif n == 2:
        return [0, 1]
    else:
        fib_sequence = [0, 1]
        for i in range(2, n):
            fib_sequence.append(fib_sequence[i-1] + fib_sequence[i-2])
        return fib_sequence

Метод 2: оптимизированная итерация с переменными

def fibonacci(n):
    if n <= 0:
        return []
    elif n == 1:
        return [0]
    elif n == 2:
        return [0, 1]
    else:
        fib_sequence = [0, 1]
        a, b = 0, 1
        for _ in range(2, n):
            a, b = b, a + b
            fib_sequence.append(b)
        return fib_sequence

Метод 3: итерация с генератором

def fibonacci(n):
    if n <= 0:
        return []
    elif n == 1:
        return [0]
    elif n == 2:
        return [0, 1]
    else:
        a, b = 0, 1
        yield a
        yield b
        for _ in range(2, n):
            a, b = b, a + b
            yield b

Метод 4: итерация с мемоизацией (кэшированием)

def fibonacci(n):
    if n <= 0:
        return []
    elif n == 1:
        return [0]
    elif n == 2:
        return [0, 1]
    else:
        fib_sequence = [0, 1]
        memo = {0: 0, 1: 1}
        for i in range(2, n):
            if i in memo:
                fib_sequence.append(memo[i])
            else:
                fib_sequence.append(fib_sequence[i-1] + fib_sequence[i-2])
                memo[i] = fib_sequence[i]
        return fib_sequence