Присоединиться

Информатика·Алгоритмы и программирование·9–11 класс

Найдите значение рекурсивной функции F(10), если F(n) = F(n−1) + F(n−2) + 1

Условие

Рекурсивная функция задана следующим образом: F(1)=1F(1) = 1, F(2)=1F(2) = 1, а для всех целых n>2n > 2 выполняется F(n)=F(n1)+F(n2)+1F(n) = F(n-1) + F(n-2) + 1. Вычислите значение F(10)F(10) и укажите, на сколько оно отличается от десятого числа Фибоначчи, задаваемого теми же начальными условиями, но соотношением без слагаемого 1.

Ответ

F(10) = 109; это на 54 больше десятого числа Фибоначчи (55)

Решение по шагам

  1. Шаг 1. Понимаем, как читать рекурсивное определение

    Определение состоит из двух частей.

    • База рекурсии: F(1)=1F(1) = 1 и F(2)=1F(2) = 1. Эти значения даны готовыми, вычислять их не нужно.
    • Рекуррентный шаг: при n>2n > 2 значение выражается через два предыдущих: F(n)=F(n1)+F(n2)+1F(n) = F(n-1) + F(n-2) + 1.

    Считать удобнее не «сверху вниз» (раскрывая F(10)F(10) через F(9)F(9) и F(8)F(8) и утопая в скобках), а снизу вверх: от базы к нужному номеру, запоминая каждое посчитанное значение. Это ровно то, что в программировании называют переходом от наивной рекурсии к динамическому программированию.

  2. Шаг 2. Считаем первые значения после базы

    Подставляем в формулу по очереди:

    F(3)=F(2)+F(1)+1=1+1+1=3;F(3) = F(2) + F(1) + 1 = 1 + 1 + 1 = 3; F(4)=F(3)+F(2)+1=3+1+1=5;F(4) = F(3) + F(2) + 1 = 3 + 1 + 1 = 5; F(5)=F(4)+F(3)+1=5+3+1=9.F(5) = F(4) + F(3) + 1 = 5 + 3 + 1 = 9.

    Главное — на каждом шаге брать два соседних предыдущих значения и не забывать про единицу. Единица прибавляется ровно один раз за шаг, независимо от номера nn.

    Видно, что значения растут примерно вдвое за шаг, поэтому до F(10)F(10) ещё пять строк таблицы.

Осталось ещё 3 шага — откроются после входа:

  • Шаг 3. Доводим таблицу до F(10)
  • Шаг 4. Сравниваем с числами Фибоначчи и проверяем закономерность
  • Шаг 5. Замечание о скорости вычислений
Получить полное решение

Бесплатно · займёт минуту

Частые ошибки

  • Забывают слагаемое +1+1 и получают обычные числа Фибоначчи: 55 вместо 109.

  • Берут F(2)=2F(2) = 2 (по аналогии с «привычной» нумерацией Фибоначчи) — вся таблица уезжает.

  • Прибавляют единицу к каждому слагаемому, то есть считают F(n1)+1+F(n2)+1F(n-1)+1+F(n-2)+1, и получают завышенные значения.

  • Сдвигают номера на единицу и в ответ пишут F(9)=67F(9) = 67 или F(11)=177F(11) = 177.

  • Пытаются раскрывать F(10)F(10) сверху вниз в одну длинную скобочную запись и теряют слагаемые.

Другие задачи по теме «Алгоритмы и программирование»