Top.Mail.Ru

Анализ исполнения алгоритма (Задание №23)

11 класс

Поделиться статьей:

Informatics

В этой статье разберёмся, как написать рекурсивную программу для решения задания №23 из ЕГЭ по информатике.

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

Вспомним, что рекурсия — это функция, которая вызывает саму себя. Значит в нашем алгоритме будут присутствовать рекурсивное нахождение ответа и базовые случаи.

Практикум: решение задач

Задание 1

У исполнителя Flash25 две команды, которым присвоены номера:

  1. прибавь 2;
  2. умножь на 2.

Сколько есть программ, которые число 1 преобразуют в число 10?

Анализ исполнения алгоритма (Задание №23 ЕГЭ)

Пусть x — это число, из которого мы идём посредством доступных ходов, а y — конечная точка маршрута.

Тогда, так как все ходы увеличивают текущее число, справедливым будет ввести базовый случай, при котором x > y, то есть достигнуть y в таком случае будет невозможно.

Если число x окажется больше, чем y, то тогда мы точно не сможем вернуться в это число y, поэтому возвращаем 0 (на схеме это отображается красными стрелочками).

Введём второй базовый случай, при котором x == y.

Если x == y, то существует только 1 способ, как дойти в эту точку (она вернётся сама в себя).

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

def f(x, y):

if x > y:

return 0

if x == y:

return 1

return f(x + 2, y) + f(x · 2, y)

print(f(1, 10))

такие программы стандартные и есть на многих сайтах

Ответ: 6.

Рассмотрим рекурсивные вызовы подробно:

f(1, 10) = f(3, 10) + f(2, 10)

f(3, 10) = f(5, 10) + f(6, 10)

f(5, 10) = f(7, 10) + f(10, 10)

f(7, 10) = f(9, 10) + f(14, 10)

f(9, 10) = f(11, 10) + f(18, 10)

f(11, 10): 11 > 10 return 0

f(18, 10): 18 > 10 return 0

f(9, 10) = 0 + 0 = 0

f(14, 10): 14 > 10 return 0

f(7, 10) = 0 + 0 = 0

f(10, 10): x == y return 1

f(5, 10) = 0 + 1 = 1

f(6, 10) = f(8, 10) + f(12, 10)

f(8, 10) = f(10, 10) + f(16, 10)

f(10, 10) = 1

f(16, 10) = 0

f(8, 10) = 1 + 0 = 1

f(12, 10): 12 > 10 return 0

f(6, 10) = 1 + 0 = 1

f(3, 10) = f(5, 10) + f(6, 10) = 1 + 1 = 2

f(2, 10) = f(4, 10) + f(4, 10) # потому что 2·2 = 4, 2+2 = 4

f(4, 10) = f(6, 10) + f(8, 10) = 1 + 1 = 2

f(2, 10) = f(4, 10) + f(4, 10) = 2 + 2 = 4

f(1, 10) = f(3, 10) + f(2, 10) = 2 + 4 = 6

Задание 2

Исполнитель Flash25 преобразует число на экране. У исполнителя есть две команды, которым присвоены номера:

  1. Прибавить 1.
  2. Прибавить 3.

Программа для исполнителя Flash25 — это последовательность команд. Сколько существует программ, для которых при исходном числе 3 результатом является число 20 и при этом траектория вычислений содержит число 15?

Раз программа содержит число 15, то оно обязательно должно быть в ней. Более того, любой путь должен проходить через это число.

Рассмотрим на примере: допустим, из числа 3 в число 15 у нас есть четыре разных пути, а из числа 15 в число 18 будет три разных пути. Тогда, чтобы из числа 3 попасть в 18, обязательно проходя через число 15, у нас есть 4 · 3 = 12 вариантов. Отобразим это замечание в программе:

def f(x, y):

if x > y:

return 0

if x == y:

return 1

return f(x + 1, y) + f(x + 3, y)

print(f(3, 15) · f(15, 20))

такие программы стандартные и есть на многих сайтах

Ответ: 240.

Мы посчитали, сколько путей идёт в число 15 и сколько путей идёт из 15 в 20, сами значения перемножили, так как на каждый путь до 15 приходится любой путь после 15.

Задание 3

Исполнитель Flash25 преобразует число на экране. У исполнителя есть две команды, которым присвоены номера:

  1. Вычти 1.
  2. Найди целую часть от деления на 2.

Первая из них уменьшает число на экране на 1, вторая заменяет число на экране на целую часть от деления числа на 2. Программа для исполнителя Flash25 — это последовательность команд. Сколько существует программ, которые преобразуют исходное число 20 в число 2?

Здесь нам впервые встречается вычитание, рассмотрим условия:

  1. В этот раз программа вернёт 0, если число x изначально меньше числа y, так как из-за этого мы никогда не сможем прийти в число y.
  2. Если x == y, мы продолжаем возвращать единичку.

def f(x, y):

if x < y:

return 0

if x == y:

return 1

return f(x – 1, y) + f(x // 2, y)

print(f(20, 2))

такие программы стандартные и есть на многих сайтах

Ответ: 77.

Забирай курсы подготовки к ОГЭ и ЕГЭ с жирной скидкой

Заключение

Мы разобрали три типовых задания на рекурсию: от простого сложения и умножения до вычитания с делением. Теперь ты сможешь решать 23-й номер на ЕГЭ — просто аккуратно прописывай рекурсию и проверяй границы переходов. Удачи!

Забирай курсы подготовки к ОГЭ и ЕГЭ с жирной скидкой

В 100б ты пробьёшь свой
максимум на экзаменах

наши лучшие курсы

Выбери подходящий курс и предмет, чтобы прокачаться и сдать ОГЭ на «5», а ЕГЭ на 80+ баллов

Выбрать курс

бесплатные материалы

Курсы, вебы, чек-листы — всё за 0 ₽

Забрать за 0 ₽

Интенсив по поступлению

Запишись на интенсив по поступлению, чтобы
взять из ЕГЭ максимум и попасть в вуз мечты

Записаться
В 100балльном репетиторе ты пробьёшь свой максимум на экзаменах

Преимущества подготовки
в 100балльном

10+
лет средний опыт наших преподавателей

18
выпускников сдали ЕГЭ
на 200 из 200 в 2024 году

300k+
учеников поступили в вуз мечты с нашей помощью 

14%
стобалльников России — наши выпускники

2 347
выпускника сдали ЕГЭ на 100 баллов

Преимущества подготовки в 100балльном

Запишись
на бесплатный
вводный урок

Познакомим с преподавателями и платформой

Расскажем про учёбу

Поможем поставить цель

  • 11 класс
  • 10 класс
  • 9 класс
  • 8 класс
  • 7 класс
Запись на вводный урок

Список всех тем