К содержанию

Задание 16

Рекуррентные выражения

Функция, заданная через саму себя: значения вручную и программой, @cache и прогрев кеша, сокращение отношений и разностей при больших аргументах, цепочки до базы и перебор n.

6 подтем · 43 задачи + 12 дополнительных · повышенный · ≈ 5 мин

Подтема 1 из 6

Функция, заданная через себя

Что спрашивают в задании 16, как читать определение функции и как посчитать её значение вручную — вниз до базы и обратно.

Как устроена тема

В задании 16 функция задана через саму себя: её значение для n выражается через значения для других аргументов. Нужно найти значение функции или выражения из нескольких её значений. Вот задача, которую мы будем решать всю тему:

«Алгоритм вычисления значения функции F(n), где n — натуральное число, задан следующими соотношениями: F(n) = 1 при n = 1; F(n) = n · F(n − 1), если n > 1. Чему равно значение выражения (F(2026) + 3 · F(2025)) / F(2024)?»

Считать F(2026) целиком не придётся: это число из тысяч цифр, и почти всё в нём сократится. Сначала разберём, что сказано в условии:

В условииЧто это значит
F(n)значение функции для аргумента n — какое-то число
n — натуральное числоаргументы 1, 2, 3, …
F(n) = 1 при n = 1для n = 1 ответ известен сразу
F(n) = n · F(n − 1), если n > 1остальные значения получают из значения для n − 1
(F(2026) + 3 · F(2025)) / F(2024)выражение из трёх значений функции — его и нужно найти

Тема состоит из шести подтем — у каждой своя страница. Идём по ним по порядку:

  1. Функция, заданная через себя — ты сейчас здесь. Считаем значения вручную на маленьких n.
  2. Рекурсивная функция на Python — решим задачу темы программой: ответ 4 108 725.
  3. Повторные вызовы и таблица — что делать, если программа считает слишком долго.
  4. Раскрыть и сократить — задача темы вручную, без программы.
  5. Цепочки до базы и перебор n — шаг через несколько чисел, две функции, поиск n.
  6. Что считает функция — дополнительный урок для редких задач про цифры числа.

Почти любую задачу можно решить и программой, и вручную. На экзамене подойдёт любой способ, а второй пригодится для проверки.

База и шаг

Как посчитать F(5) по такому определению?

Значение для n = 1 известно сразу. Каждое следующее получается из предыдущего по формуле — так шаг за шагом доходим до нужного n. Возьмём функцию задачи темы:

nВычислениеF(n)
1дано в условии1
22 · F(1) = 2 · 12
33 · F(2) = 3 · 26
44 · F(3) = 4 · 624
55 · F(4) = 5 · 24120

Значение, которое задано сразу, называют базой: здесь это F(1) = 1. Формулу, которая выражает F(n) через другие значения функции, — рекуррентным соотношением: F(n) = n · F(n − 1).

У нашей функции F(n) = 1 · 2 · 3 · … · n. Такое произведение называют факториалом и пишут n!, например 5! = 120.

Скобки после F всегда значат одно: посчитать функцию для того числа, что стоит в скобках. Поэтому похожие записи дают разные числа:

ЗаписьЧто сделатьПри n = 3
F(n − 1)посчитать F для аргумента n − 1F(2) = 2
F(n) − 1посчитать F(n) и вычесть 16 − 1 = 5
2 · F(n)посчитать F(n) и умножить на 22 · 6 = 12
F(2n)посчитать F для аргумента 2nF(6) = 720

Вниз до базы и обратно

А если предыдущих значений ещё нет, а нужно сразу F(5)?

Тогда вычисление сначала спускается до базы, а потом поднимается обратно. F(5) = 5 · F(4), но F(4) неизвестно — F(5) ждёт. F(4) = 4 · F(3) — ждёт и F(4). Так до F(1) = 1. Дальше ждущие вызовы получают ответы и доделывают своё умножение: F(2) = 2, F(3) = 6, F(4) = 24, F(5) = 120. Пройди этот путь по шагам:

  1. F(5) = 5 · F(4). Значения F(4) ещё нет, поэтому F(5) ждёт и помнит, что потом умножит его на 5.
  2. F(4) = 4 · F(3). Значения F(3) ещё нет, поэтому F(4) ждёт и помнит, что потом умножит его на 4.
  3. F(3) = 3 · F(2). Значения F(2) ещё нет, поэтому F(3) ждёт и помнит, что потом умножит его на 3.
  4. F(2) = 2 · F(1). Значения F(1) ещё нет, поэтому F(2) ждёт и помнит, что потом умножит его на 2.
  5. F(1) = 1 дано в условии — это база, новых запросов нет.
  6. F(1) возвращает 1 тому, кто его ждал, — вызову F(2).
  7. F(2) получил F(1) = 1 и выполнил отложенное действие: 2 · 1 = 2.
  8. F(3) получил F(2) = 2 и выполнил отложенное действие: 3 · 2 = 6.
  9. F(4) получил F(3) = 6 и выполнил отложенное действие: 4 · 6 = 24.
  10. F(5) получил F(4) = 24 и выполнил отложенное действие: 5 · 24 = 120. Ждущих вызовов не осталось — ответ готов.

Заметь порядок: F(1) начался последним, а закончился первым; F(5) начался первым, а закончился последним. Ждущие вызовы хранятся как стопка — что положили последним, то снимают первым. Её называют . У каждого вызова своё n: когда F(5) дождётся F(4) = 24, он умножит его именно на 5.

Ветви по условию

Что делать, если формул несколько и выбор зависит от n? Например:

F(n) = n при n ≤ 2; F(n) = F(n − 1) + n, если n > 2 и n чётно; F(n) = 2 · F(n − 2), если n > 2 и n нечётно.

Формулу выбирают заново для каждого аргумента, который встретился по пути. Найдём F(8):

АргументКакая формулаЧто получается
8чётное, больше 2F(8) = F(7) + 8
7нечётное, больше 2F(7) = 2 · F(5)
5нечётное, больше 2F(5) = 2 · F(3)
3нечётное, больше 2F(3) = 2 · F(1)
1не больше 2F(1) = 1

Поднимаемся обратно: F(3) = 2, F(5) = 4, F(7) = 8, F(8) = 8 + 8 = 16.

Частая ошибка — выбрать формулу один раз по первому аргументу: 8 чётное, и дальше везде брать F(n − 1) + n. Так получится 35 вместо 16.

База сверху

Аргумент всегда уменьшается?

Нет: база может стоять сверху, и тогда аргумент растёт, пока не дойдёт до неё. Например: F(n) = n при n ≥ 10; F(n) = n + F(n + 1) при n < 10.

F(7) = 7 + F(8) = 7 + 8 + F(9) = 7 + 8 + 9 + F(10). При n = 10 работает база: F(10) = 10. Значит, F(7) = 7 + 8 + 9 + 10 = 34.

Порядок тот же: запросы идут от 7 к базе, результаты возвращаются обратно. Важно одно — чтобы аргументы дошли до базы. Как это проверять, разберём в следующей подтеме.

Итого

  • Базазначение, известное сразу: F(1) = 1
  • Рекуррентное соотношениеF(n) через другие значения: F(n) = n · F(n − 1)
  • СкобкиF(n − 1) — функция от n − 1, F(n) − 1 — значение минус 1
  • Вниз и обратнозапросы до базы, потом ждущие вызовы доделывают действия
  • Ветвиформулу выбирают для каждого аргумента
  • База сверхуаргумент растёт, пока не дойдёт до неё

Проверьте себя

Ответь сначала сам, потом открой ответ.

Вопрос 1
Для функции задачи темы найди F(6).
ОтветСкрыть ответ
Ответ
720: F(5) = 120, F(6) = 6 · 120.
Вопрос 2
Для функции задачи темы чему равны F(4 − 1) и F(4) − 1? Почему числа разные?
ОтветСкрыть ответ
Ответ
F(4 − 1) = F(3) = 6 — функция от 3. F(4) − 1 = 24 − 1 = 23 — значение F(4) минус единица.
Вопрос 3
F(1) = 3; F(n) = 2 · F(n − 1) + n при n > 1. Найди F(4).
ОтветСкрыть ответ
Ответ
42: F(2) = 8, F(3) = 19, F(4) = 2 · 19 + 4.
Вопрос 4
Для функции с ветвями из раздела «Ветви по условию» найди F(6).
ОтветСкрыть ответ
Ответ
10: 6 чётное — F(6) = F(5) + 6; 5 нечётное — F(5) = 2 · F(3); F(3) = 2 · F(1) = 2. Обратно: F(5) = 4, F(6) = 10.
Вопрос 5
F(n) = n при n ≥ 10; F(n) = n + F(n + 1) при n < 10. Найди F(8).
ОтветСкрыть ответ
Ответ
27: F(8) = 8 + F(9) = 8 + 9 + F(10) = 8 + 9 + 10.

Практика

Для проверки ответов нужен JavaScript. Условия, подсказки и решения доступны ниже.

Прибавка 2n

F(1) = 3; F(n) = F(n − 1) + 2n при n > 1. Найди F(5).

Введите число.

Утроить и вычесть единицу

F(1) = 2; F(n) = 3 · F(n − 1) − 1 при n > 1. Найди F(4).

Введите число.

Скобки после имени функции

Пусть F(n) = 3n − 2. Чему равно F(2 · 3) − 2 · F(3)?

Введите число.

Два предыдущих значения

F(1) = 2, F(2) = 3; F(n) = F(n − 1) + 2 · F(n − 2) при n > 2. Найди F(6).

Введите число.

Шаг назад на три

F(1) = F(2) = F(3) = 1; F(n) = F(n − 1) + F(n − 3) при n > 3. Найди F(10).

Введите число.

Задача в формате экзамена: F(6)

Алгоритм вычисления значения функции F(n), где n — натуральное число, задан следующими соотношениями: F(n) = n + 2 при n ≤ 2; F(n) = 2 · F(n − 1) − F(n − 2) + n при n > 2. Чему равно значение функции F(6)?

Введите число.

Задача в формате экзамена: F(5)

Алгоритм вычисления значения функции F(n), где n — натуральное число, задан следующими соотношениями: F(1) = 1; F(n) = F(n − 1) · (n + 1) при n > 1. Чему равно значение функции F(5)?

Введите число.

Ветвь по чётности

F(n) = n при n ≤ 2; F(n) = F(n − 1) + n, если n > 2 и n чётно; F(n) = 2 · F(n − 2), если n > 2 и n нечётно. Найди F(12).

Введите число.

Ветвь для каждого вызова

F(1) = 5; F(n) = F(n − 1) − 2, если n чётно; F(n) = F(n − 1) + 3n, если n > 1 и n нечётно. Найди F(6).

Введите число.

Задача в формате экзамена: F(14)

Алгоритм вычисления значения функции F(n), где n — натуральное число, задан следующими соотношениями: F(n) = 1 при n = 1; F(n) = n + F(n − 1), если n чётно; F(n) = 3 · F(n − 2), если n > 1 и при этом n нечётно. Чему равно значение функции F(14)?

Введите число.

База сверху

F(n) = n при n ≥ 20; F(n) = F(n + 3) + 2 при n < 20. Найди F(4).

Введите число.

Вверх с вычитанием

F(n) = n при n > 30; F(n) = F(n + 4) − 1 при n ≤ 30. Найди F(17).

Введите число.