Исполнитель преобразует число на экране.
У исполнителя есть две команды, которые обозначены латинскими буквами:
A. Прибавь 1
B. Поменяй местами
Первая из этих команд увеличивает число на экране на 1.
Вторая команда применяется только к числу, у которого цифра в разряде десятков по значению меньше цифры, стоящей в разряде единиц, и действует, заменяя число на экране числом, в котором цифры двух младших разрядов поменялись местами.
Программа для исполнителя – это последовательность команд.
Сколько существует программ, для которых при исходном числе 68 результатом является число 120?
Траектория вычислений программы – это последовательность результатов выполнения всех команд программы.
Например, для программы ABA при исходном числе 13 траектория состоит из чисел 14, 41, 42
Способ 1 (С рекурсией)
🔹 Шаг 1. Идея решения задачи
📌 Нужно посчитать количество программ, которые переводят число 68 → 120. У исполнителя две команды: прибавить 1 и поменять местами цифры десятков и единиц, если разряд десятков меньше разряда единиц.
🔹 Шаг 2. Функция и запретный случай
def f(x, y):
if x > y:
return 0
if x == y:
return 1
a = x // 100
b = (x // 10) % 10
c = x % 10
if b < c:
return f(x + 1, y) + f(a * 100 + c * 10 + b, y)
return f(x + 1, y)
print(f(68, 120))
📌 Функция f(x, y) считает, сколько программ переводят x в y. Если текущее число превысило целевое, путь невозможен — возвращаем 0.
🔹 Шаг 3. Условие успешного завершения
if x == y:
return 1
📌 Если текущее число равно целевому, программа успешно завершилась — найден один корректный путь.
🔹 Шаг 4. Выделяем цифры числа
a = x // 100
b = (x // 10) % 10
c = x % 10
📌 Для команды обмена нужны цифры: a — сотни (для двузначных чисел это 0), b — десятки, c — единицы.
🔹 Шаг 5. Переходы по командам исполнителя
if b < c:
return f(x + 1, y) + f(a * 100 + c * 10 + b, y)
return f(x + 1, y)
📌 Если b < c, складываем варианты по командам +1 и обмен десятков с единицами. Иначе доступна только команда +1.
🔹 Финальный шаг. Вывод ответа
print(f(68, 120))
📌 Выводим количество программ из 68 в 120.
Способ 1 (С рекурсией)
🔹 Шаг 1. Идея решения задачи
📌 Нужно посчитать количество программ, которые переводят число 68 → 120. У исполнителя две команды: прибавить 1 и поменять местами цифры десятков и единиц, если разряд десятков меньше разряда единиц.
🔹 Шаг 2. Функция и запретный случай
def f(x, y):
if x > y:
return 0
if x == y:
return 1
a = x // 100
b = (x // 10) % 10
c = x % 10
if b < c:
return f(x + 1, y) + f(a * 100 + c * 10 + b, y)
return f(x + 1, y)
print(f(68, 120))
📌 Функция f(x, y) считает, сколько программ переводят x в y. Если текущее число превысило целевое, путь невозможен — возвращаем 0.
🔹 Шаг 3. Условие успешного завершения
if x == y:
return 1
📌 Если текущее число равно целевому, программа успешно завершилась — найден один корректный путь.
🔹 Шаг 4. Выделяем цифры числа
a = x // 100
b = (x // 10) % 10
c = x % 10
📌 Для команды обмена нужны цифры: a — сотни (для двузначных чисел это 0), b — десятки, c — единицы.
🔹 Шаг 5. Переходы по командам исполнителя
if b < c:
return f(x + 1, y) + f(a * 100 + c * 10 + b, y)
return f(x + 1, y)
📌 Если b < c, складываем варианты по командам +1 и обмен десятков с единицами. Иначе доступна только команда +1.
🔹 Финальный шаг. Вывод ответа
print(f(68, 120))
📌 Выводим количество программ из 68 в 120.
Способ 1 (С рекурсией)
🔹 Шаг 1. Идея решения задачи
📌 Нужно посчитать количество программ, которые переводят число 68 → 120. У исполнителя две команды: прибавить 1 и поменять местами цифры десятков и единиц, если разряд десятков меньше разряда единиц.
🔹 Шаг 2. Функция и запретный случай
def f(x, y):
if x > y:
return 0
if x == y:
return 1
a = x // 100
b = (x // 10) % 10
c = x % 10
if b < c:
return f(x + 1, y) + f(a * 100 + c * 10 + b, y)
return f(x + 1, y)
print(f(68, 120))
📌 Функция f(x, y) считает, сколько программ переводят x в y. Если текущее число превысило целевое, путь невозможен — возвращаем 0.
🔹 Шаг 3. Условие успешного завершения
if x == y:
return 1
📌 Если текущее число равно целевому, программа успешно завершилась — найден один корректный путь.
🔹 Шаг 4. Выделяем цифры числа
a = x // 100
b = (x // 10) % 10
c = x % 10
📌 Для команды обмена нужны цифры: a — сотни (для двузначных чисел это 0), b — десятки, c — единицы.
🔹 Шаг 5. Переходы по командам исполнителя
if b < c:
return f(x + 1, y) + f(a * 100 + c * 10 + b, y)
return f(x + 1, y)
📌 Если b < c, складываем варианты по командам +1 и обмен десятков с единицами. Иначе доступна только команда +1.
🔹 Финальный шаг. Вывод ответа
print(f(68, 120))
📌 Выводим количество программ из 68 в 120.