Исполнитель Калькулятор преобразует число на экране.
У исполнителя есть три команды, которым присвоены номера:
1. Прибавить 1
2. Умножить на 2
3. Прибавить 3
Первая команда увеличивает число на экране на 1, вторая умножает его на 2, третья увеличивает на 3.
Программа для исполнителя Калькулятор — это последовательность команд.
Сколько существует программ, которые преобразуют исходное число 2 в число 20 и при этом траектория вычислений не содержит чисел 7 и 15?
Траектория вычислений — это последовательность результатов выполнения всех команд программы. Например, для программы 312 при исходном числе 6 траектория будет состоять из чисел 9, 10, 20.
Решение 1 (Рекурсия)
def f(a, b):
if a == b:
return 1
if a > b or a == 7 or a == 15:
return 0
return f(a + 1, b) + f(a * 2, b) + f(a + 3, b)
print(f(2, 20))
Решение 2 (Динамика)
a = [0] * 21
a[2] = 1
for i in range(3, 21):
if i == 7 or i == 15:
continue
if i % 2 == 0:
a[i] += a[i // 2]
a[i] += a[i - 3]
a[i] += a[i - 1]
print(a[20])