Исполнитель Увеличитель преобразует число на экране.
У исполнителя есть две команды, которым присвоены номера:
1. Прибавить 1
2. Прибавить 3
Первая команда увеличивает число на экране на 1, вторая — на 3.
Программа для исполнителя Увеличитель — это последовательность команд.
Сколько существует программ, для которых при исходном числе 1 результатом является число 15 и при этом траектория вычислений содержит число 10 и не содержит число 12?
Траектория вычислений программы — это последовательность результатов выполнения всех команд программы. Например, для программы 112 при исходном числе 5 траектория будет состоять из чисел 6, 7, 10.
Пусть R(n) — количество программ, которые число 1 преобразуют в число n.
Тогда справедлива следующая формула: R(n) = R(n - 1) + R(n - 3).
С её помощью последовательно вычислим значения R(n):
R(1) = 1
R(2) = R(1) + R(-1) = 1 + 0 = 1
R(3) = R(2) + R(0) = 1 + 0 = 1
R(4) = R(3) + R(1) = 1 + 1 = 2
R(5) = R(4) + R(2) = 2 + 1 = 3
R(6) = R(5) + R(3) = 3 + 1 = 4
R(7) = R(6) + R(4) = 4 + 2 = 6
R(8) = R(7) + R(5) = 6 + 3 = 9
R(9) = R(8) + R(6) = 9 + 4 = 13
R(10) = R(9) + R(7) = 13 + 6 = 19
Так как в траектории должно присутствовать число 10, то для всех следующих R(n) нельзя использовать при пересчёте R(m) такие, что m < 10.
R(11) = R(10) = 19
Число 12 наоборот, не должно встречаться в траектории, поэтому не будем считать R(12), а все следующие R(n) будем пересчитывать без R(12).
R(13) = R(10) = 19
R(14) = R(13) + R(11) = 19 + 19 = 38
R(15) = R(14) = 38
Ответ: 38.
Приведём другое решение на языке Python.
def f(x, y):
if x > y or x == 12:
return 0
if x == y:
return 1
else:
return f(x + 1, y) + f(x + 3, y)
print(f(1, 10) * f(10, 15))

