Найдите значение рекурсивной функции F(10), если F(n) = F(n−1) + F(n−2) + 1
Условие
Рекурсивная функция задана следующим образом: , , а для всех целых выполняется . Вычислите значение и укажите, на сколько оно отличается от десятого числа Фибоначчи, задаваемого теми же начальными условиями, но соотношением без слагаемого 1.
Ответ
F(10) = 109; это на 54 больше десятого числа Фибоначчи (55)
Решение по шагам
Шаг 1. Понимаем, как читать рекурсивное определение
Определение состоит из двух частей.
- База рекурсии: и . Эти значения даны готовыми, вычислять их не нужно.
- Рекуррентный шаг: при значение выражается через два предыдущих: .
Считать удобнее не «сверху вниз» (раскрывая через и и утопая в скобках), а снизу вверх: от базы к нужному номеру, запоминая каждое посчитанное значение. Это ровно то, что в программировании называют переходом от наивной рекурсии к динамическому программированию.
Шаг 2. Считаем первые значения после базы
Подставляем в формулу по очереди:
Главное — на каждом шаге брать два соседних предыдущих значения и не забывать про единицу. Единица прибавляется ровно один раз за шаг, независимо от номера .
Видно, что значения растут примерно вдвое за шаг, поэтому до ещё пять строк таблицы.
Осталось ещё 3 шага — откроются после входа:
- Шаг 3. Доводим таблицу до F(10)
- Шаг 4. Сравниваем с числами Фибоначчи и проверяем закономерность
- Шаг 5. Замечание о скорости вычислений
Бесплатно · займёт минуту
Частые ошибки
- ✗
Забывают слагаемое и получают обычные числа Фибоначчи: 55 вместо 109.
- ✗
Берут (по аналогии с «привычной» нумерацией Фибоначчи) — вся таблица уезжает.
- ✗
Прибавляют единицу к каждому слагаемому, то есть считают , и получают завышенные значения.
- ✗
Сдвигают номера на единицу и в ответ пишут или .
- ✗
Пытаются раскрывать сверху вниз в одну длинную скобочную запись и теряют слагаемые.