Task Livecoding Java Fib Refactor

31. Рефакторинг функции Фибоначчи #

Условие задачи:
🔥 Проведи рефакторинг функции вычисления числа Фибоначчи.
В оригинальном коде используется рекурсия без оптимизации, что приводит к экспоненциальной сложности.

Код:

int fib(int n) {
    if (n <= 1) return n;
    return fib(n-1) + fib(n-2);
}
Спойлеры к решению
Подсказки
💡 Оригинальная сложность: Рекурсивное вычисление без мемоизации имеет экспоненциальную сложность O(2^n).
💡 Оптимизация: Используй итеративное вычисление или мемоизацию (динамическое программирование), чтобы снизить сложность до O(n).
💡 Итеративный подход: Применение цикла для последовательного вычисления чисел Фибоначчи – эффективное решение для данной задачи.
Решение
public class Fibonacci {

    // Итеративная реализация с линейной сложностью O(n)
    public static int fib(int n) {
        if (n <= 1) return n;
        int a = 0, b = 1;
        for (int i = 2; i <= n; i++) {
            int next = a + b;
            a = b;
            b = next;
        }
        return b;
    }
    
    public static void main(String[] args) {
        System.out.println("fib(10) = " + fib(10)); // Пример: 55
    }
}

📌 Что улучшилось?
Снижение сложности: Итеративный подход снижает асимптотику с экспоненциальной до O(n).
Экономия памяти: Использование двух переменных для хранения предыдущих значений вместо рекурсивного стека.
Повышенная производительность: Новый подход позволяет эффективно вычислять Fibonacci для больших значений n.