Вариант 1
F и G, большое nАлгоритм вычисления функций F(n) и G(n), где n — целое число, задан следующими соотношениями:
F(n) = 2 × (G(n − 1) + 12);
G(n) = 3 × n, если n < 10;
G(n) = G(n − 4) + 7, если n ≥ 10.
Чему равно значение выражения F(29878)?
Разбор
Шаг 1. F(29878) = 2·(G(29877) + 12).
Шаг 2. Каждый шаг G уменьшает аргумент на 4 и добавляет 7. От 29877 до значения меньше 10 нужно t = ⌊(29877 − 10) / 4⌋ + 1 = 7467 шагов; аргумент станет 9.
Шаг 3. G(29877) = G(9) + 7·7467 = 27 + 52269 = 52296. F(29878) = 2·(52296 + 12) = 104616.
Программой. Прямой вызов упадёт с ошибкой «maximum recursion depth exceeded»: глубина рекурсии тысячи вызовов. Помогает запоминание @lru_cache и постепенное заполнение: вызываем G для 0, 1, 2, … по порядку — тогда каждый новый вызов сразу находит уже посчитанное значение.
Ответ: 104616
Решение на Python.
from functools import lru_cache
import sys
sys.setrecursionlimit(10000)
@lru_cache(None)
def G(n):
if n < 10:
return 3 * n
return G(n - 4) + 7
def F(n):
return 2 * (G(n - 1) + 12)
for i in range(29878): # заполняем кэш по возрастанию: каждый вызов опирается на готовые значения
G(i)
print(F(29878))