К содержанию

Задание 16 · Рекуррентные выражения

Практика и итог

Вся тема на одной странице: как решилась задача темы, главное из подтем, порядок решения и частые ошибки.

Одна задача — вся тема

Задача темы — (F(2026) + 3 · F(2025)) / F(2024) для F(n) = n · F(n − 1) — прошла через подтемы, и каждая решала её новым способом. Пролистай версии: точками отмечены строки, которых не было в предыдущей.

  1. Подтема 1, «Функция через себя»: база и шаг: от базы вверх. Точками отмечены новые строки.
  2. Подтема 2, «Функция на Python»: определение как есть.
  3. Подтема 3, «Повторы и таблица»: таблица значений циклом от базы.
  4. Подтема 4, «Раскрыть и сократить»: без программы: общий множитель. Ответ задачи темы — 4 108 725.

Три способа — рекурсия, таблица и сокращение — дали одно число и проверяют друг друга. Подтема 5 добавляет цепочки с шагом больше единицы и поиск n, а дополнительный урок — функции, которые что-то считают, например сумму цифр.

Карта темы

Каждая подтема дала один приём, и любое решение собирается из них. Сверху — путь от определения к ответу, ниже — по блоку на подтему. Заголовок блока ведёт на подтему.

  1. Правилабаза, шаг, ветви
  2. Способпрограмма или раскрыть и сократить
  3. Ответзначение, выражение или n

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

  • базазначение, известное сразу
  • F(n − 1)значение для аргумента n − 1, не F(n) − 1
  • ветвивыбирают в каждом вызове

2Рекурсивная функция на Python

  • return n * F(n - 1)определение как есть
  • sys.setrecursionlimitдля аргументов в тысячи
  • //деление нацело — ответ целым числом

3Повторные вызовы и таблица

  • @cacheкаждое значение считается один раз
  • таблицаf[n] = F(n) циклом от базы

4Раскрыть и сократить

  • отношениераскрыть до общего множителя
  • разностьостаются прибавки

5Цепочки до базы и перебор n

  • шаг kсвоя цепочка и свой конец по остатку
  • поиск nперебор со счётчиком или while

6Что считает функциядополнительный урок

  • F(n // b) + n % bсумма цифр в системе b
Карта темы: путь к ответу сверху и главное из каждой подтемы. Номер блока — номер подтемы.

Как решать

Любое задание 16 решается одним порядком из пяти шагов. Каждому шагу ты уже учился — под ним номера подтем:

Главный шаг — способ: аргументы в тысячи с отношением или разностью удобнее раскрыть и сократить, остальное — программой по определению. Проверка — вторым способом на маленьких n.

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

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

F(n) − 1
вместо F(n − 1) посчитали F(n) − 1 → скобки после F — аргумент. Спроси себя: что стоит в скобках?подтема 1
одна ветвь
ветвь выбрали один раз по первому аргументу → ветвь — в каждом вызове. Спроси себя: какой аргумент у этого вызова?подтема 1
n == 1 в базе
if n == 1 → if n <= 1. Спроси себя: база в условии — равенство или неравенство?подтема 2
RecursionError
F(2026) без поднятого предела → sys.setrecursionlimit или прогрев кеша. Спроси себя: сколько вызовов в цепочке до базы?подтема 2
4108725.0
… / F(2024) → … // F(2024). Спроси себя: ответ должен быть целым?подтема 2
считает минуты
функция с двумя вызовами себя без кеша → @cache над функцией. Спроси себя: не считается ли одно значение много раз?подтема 3
IndexError
f = [0] * 2026 → f = [0] * 2027. Спроси себя: есть ли в списке элемент f[2026]?подтема 3
конец цепочки
цепочку с шагом 3 довели до той же базы → конец зависит от остатка — пройти цепочку. Спроси себя: в какое число упрётся эта цепочка?подтема 5

Итог

Тема пройдена: задача темы решена тремя способами — ответ 4 108 725. Вот что взять с собой.

  • ПорядокПравила, способ, программа или сокращение, проверка.
  • ПрограммаОпределение как есть, // и предел глубины.
  • Скорость@cache, прогрев или таблица циклом от базы.
  • СокращениеРаскрыть до общего множителя или прибавок.
  • Задача темы(2026 + 3) · 2025 = 4 108 725.

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

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

Вопрос 1

Для функции задачи темы найди F(2026) / F(2024).

ОтветСкрыть ответ
Ответ

2026 · 2025 = 4 102 650: F(2024) сокращается.

Вопрос 2

Почему программа с вызовами F(n − 1) и F(n − 2) считает F(40) долго?

ОтветСкрыть ответ
Ответ

Одни и те же значения считаются снова и снова — вызовов экспоненциально много. @cache считает каждое один раз.

Вопрос 3

Функцию с @cache сразу вызвали для n = 10 000 — и получили RecursionError. Что сделать?

ОтветСкрыть ответ
Ответ

Поднять предел глубины или прогреть кеш: вызвать F(n) по очереди от маленьких n, тогда каждый вызов уходит вглубь на один шаг.

Вопрос 4

F(n) = F(n − 3) + 2 при n > 3, F(n) = n при n ≤ 3. Чему равно F(10)?

ОтветСкрыть ответ
Ответ

Цепочка 10 → 7 → 4 → 1: F(1) = 1, плюс три прибавки по 2 — F(10) = 7.

Практика

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

Ветвь для каждого вызова: F(21)

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

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

Общий множитель

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

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

Разность при шаге 3

Алгоритм вычисления значения функции F(n), где n — натуральное число, задан следующими соотношениями: F(n) = n при n < 7; F(n) = n + 2 + F(n − 3), если n ≥ 7. Чему равно значение выражения F(4000) − F(3991)?

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

Первое n с F(n) = 9

Алгоритм вычисления значения функции F(n), где n — целое неотрицательное число, задан следующими соотношениями: F(0) = 0; F(n) = F(n / 3), если n > 0 и n делится на 3; F(n) = (n mod 3) + F(n − (n mod 3)), если n не делится на 3. Назови минимальное значение n, для которого F(n) = 9.

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

Две функции и точное деление

Алгоритм вычисления значений функций F(n) и G(n), где n — целое число, задан следующими соотношениями: F(n) = F(n − 3) + 7, если n ≥ 15; F(n) = 4 · (G(n + 2) − 3), если n < 15; G(n) = n / 4, если n ≥ 50; G(n) = G(n + 5) + 3, если n < 50. Чему равно значение функции F(100)?

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