← Назад к ДП

Числа Фибоначчи

Классический пример динамического программирования

🐍 Python (рекурсия + мемоизация)
def fib_rec(n, memo={}):
    if n <= 1:
        return n
    if n in memo:
        return memo[n]
    memo[n] = fib_rec(n-1, memo) + fib_rec(n-2, memo)
    return memo[n]

n = int(input())
print(fib_rec(n))
⚙️ C++ (рекурсия + мемоизация)
#include <bits/stdc++.h>
using namespace std;

vector<long long> memo;

long long fib_rec(int n) {
    if (n <= 1) return n;
    if (memo[n] != -1) return memo[n];
    return memo[n] = fib_rec(n-1) + fib_rec(n-2);
}

int main() {
    int n;
    cin >> n;
    memo.assign(n + 1, -1);
    cout << fib_rec(n) << endl;
    return 0;
}
🐍 Python (DP — итеративный)
n = int(input())
dp = [0] * (n + 1)
dp[0] = 0
dp[1] = 1
for i in range(2, n + 1):
    dp[i] = dp[i-1] + dp[i-2]
print(dp[n])
⚙️ C++ (DP — итеративный)
#include <bits/stdc++.h>
using namespace std;

int main() {
    int n;
    cin >> n;
    vector<long long> dp(n + 1);
    dp[0] = 0;
    dp[1] = 1;
    for (int i = 2; i <= n; i++) {
        dp[i] = dp[i-1] + dp[i-2];
    }
    cout << dp[n] << endl;
    return 0;
}

Как работают числа Фибоначчи?

Числа Фибоначчи — это последовательность, в которой каждое следующее число равно сумме двух предыдущих: F(0) = 0, F(1) = 1, F(n) = F(n-1) + F(n-2).

Задача идеально подходит для демонстрации динамического программирования, так как наивная рекурсия многократно вычисляет одни и те же подзадачи.

Два подхода к решению

Временная сложность: O(n) — каждое число вычисляется один раз.

Пространственная сложность: O(n) для массива memo/dp или O(1) для оптимизированного варианта (хранить только два последних числа).

Формат ввода и вывода

Ввод:

Вывод:

Пример ввода:

10

Вывод: 55

Ряд Фибоначчи: F(0)=0, F(1)=1, F(2)=1, F(3)=2, F(4)=3, F(5)=5, F(6)=8, F(7)=13, F(8)=21, F(9)=34, F(10)=55

Попробовать онлайн

Введите номер числа Фибоначчи:

Результат появится здесь...