Информатика: ОГЭ и ЕГЭ

Разборы · ЕГЭ, задание 16

Задание 16 ЕГЭ по информатике: рекурсивные функции

Что проверяет задание

Функция F(n) задана рекуррентными соотношениями: F(1) = …, F(n) = … через F(n − 1). Нужно вычислить её значение или выражение из нескольких значений при больших n. 1 балл.

Что нужно знать

Как решать

  1. Посмотрите на формулу: иногда выражение упрощается вручную (как в примере ниже).
  2. Если нет — посчитайте значения циклом и подставьте в выражение.
  3. Если в формуле есть F(n // 2), F(n + 1) или несколько ветвей по чётности, используйте запоминание с прогревом: так не нужно думать, в каком порядке считать значения.

Проверяйте функцию на маленьких n, которые легко посчитать вручную: F(1), F(2), F(3). Если здесь всё совпало, большие значения тоже будут верны.

Пример из демоверсии 2027

F(n) = 1 при n = 1; F(n) = n × F(n − 1) при n > 1. Чему равно (F(3038) + 5 × F(3037)) / F(3036)?

Решение вручную. F(n) = n! — факториал. F(3038) = 3038 · 3037 · F(3036), F(3037) = 3037 · F(3036). Делим: 3038 · 3037 + 5 · 3037 = 3037 · 3043 = 9241591.

Программой:

F = {1: 1}                          # F(1) = 1
for n in range(2, 3039):
    F[n] = n * F[n - 1]             # F(n) = n × F(n − 1)

print((F[3038] + 5 * F[3037]) // F[3036])        # 9241591

Вариант с запоминанием и прогревом — удобен, когда формула сложная (несколько ветвей, F(n − 2), F(n // 2) и т. п.):

from functools import lru_cache

@lru_cache(None)
def F(n):
    if n == 1:
        return 1
    return n * F(n - 1)

for n in range(1, 3039):            # прогрев: считаем значения по порядку
    F(n)
print((F(3038) + 5 * F(3037)) // F(3036))        # 9241591

Типичные ошибки

Потренироваться: задание 16 новые варианты с проверкой ответа

Подготовиться с репетитором

На занятиях разбираем каждое задание в формате экзамена и отрабатываем его на тренажёрах с проверкой по критериям.

Записаться на пробное занятие

Другие разборы