решай.ai · шпаргалка

Задание 16: Рекурсивные алгоритмы

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

Как выглядит

Типичная формулировка: «Алгоритм вычисления значения функции F(n)F(n), где nn — целое неотрицательное число, задан следующими соотношениями: F(0)=...F(0)=...; F(n)=...F(n)=..., если n>0n>0 и чётно; F(n)=...F(n)=..., если nn нечётно. Чему равно значение F(N)F(N)?» или «Сколько существует таких nn в диапазоне [a;b][a;b], что F(n)=kF(n)=k?»

…

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

  • Рекурсия состоит из базового случая (значение функции при конкретном nn, обычно n=0n=0 или n=1n=1) и рекуррентного перехода, выражающего F(n)F(n) через FF от меньшего аргумента.
  • Чётность числа определяется остатком от деления на 2: n mod 2=0n \bmod 2 = 0 — чётное, n mod 2=1n \bmod 2 = 1 — нечётное.
  • Целочисленное деление (обычно обозначается как n/2n/2 в условии таких задач) означает ⌊n/2⌋\left\lfloor n/2 \right\rfloor — деление с отбрасыванием остатка.
  • Глубина рекурсии — количество шагов от F(n)F(n) до базового случая. У функций с одним предыдущим значением глубина равна nn; у функций вида «делим на 2» глубина порядка log⁡2n\log_2 n.
  • Разложение числа в двоичной системе: любое натуральное число можно представить как сумму степеней двойки, а операция «nn чётно — делим на 2, нечётно — вычитаем 1» соответствует последовательному разбору двоичных разрядов.
  • Число единичных битов в двоичной записи числа nn иногда называют весом Хэмминга или popcount — это стандартная интерпретация ряда рекурсивных функций деления на 2.
  • Сумма арифметической прогрессии: S=(a1+an)⋅n2S = \dfrac{(a_1+a_n)\cdot n}{2}; сумма квадратов первых nn натуральных чисел: ∑k=1nk2=n(n+1)(2n+1)6\displaystyle\sum_{k=1}^{n} k^2 = \dfrac{n(n+1)(2n+1)}{6} — такие формулы помогают проверять результат прикидочно.
  • Число сочетаний Cnk=n!k!(n−k)!C_n^k = \dfrac{n!}{k!(n-k)!} применяется, когда нужно посчитать количество чисел с заданным количеством единичных битов в двоичной записи.

Алгоритм

  1. Определить тип задачи: нужно найти конкретное значение F(N)F(N) или посчитать количество чисел nn с определённым свойством результата.
  2. Выписать базовый случай и все ветки перехода, обратив внимание на условия (строгое/нестрогое неравенство, чётность/нечётность).
  3. Если рекурсия опирается на одно предыдущее значение — построить таблицу от базового случая вверх до нужного nn, вычисляя каждое значение по формуле.
  4. Если рекурсия использует деление на 2 или пропуск через два шага — распознать закономерность на малых числах (0, 1, 2, ..., 10) и сформулировать общее правило (например, что функция считает количество единиц в двоичной записи или сумму определённых слагаемых).
  5. Аккуратно проводить арифметику на каждом шаге, особенно операции целочисленного деления и возведения в степень — ошибка на одном шаге ломает всю цепочку. …

Ловушки

  • Путаница между обычным делением и целочисленным: запись n/2n/2 в условии почти всегда означает ⌊n/2⌋\left\lfloor n/2 \right\rfloor, а не результат с дробной частью.
  • Пропуск или неверное применение базового случая — важно проверить, при каком именно nn задано базовое значение (n=0n=0, n=1n=1 или n≤1n \le 1), иначе цепочка обрывается неправильно.
  • Смешивание веток чётных и нечётных индексов при рекурсии вида F(n)=2F(n−2)F(n)=2F(n-2): такая рекурсия связывает только числа одной чётности, попытка идти через F(n−1)F(n-1) приведёт к неверному результату.
  • Арифметические ошибки при вычислении квадратов, кубов или сумм на длинной цепочке — рекомендуется вести таблицу с промежуточными значениями, а не считать всё в уме. …
reshay.ai/ege/informatika/zadanie-16 — задачи с разборами и тренажёр

Полный гайд и задачи задания 16 →