Тип 23 № 14783 
Оператор присваивания и ветвления. Перебор вариантов, построение дерева. Количество программ с обязательным этапом
i
Исполнитель Тренер преобразует число на экране.
У исполнителя есть две команды, которым присвоены номера.
1. Прибавить 1.
2. Умножить на 2.
Первая команда увеличивает число на экране на 1, вторая умножает его на 2. Программа для исполнителя Тренер — это последовательность команд.
Сколько существует программ, которые преобразуют исходное число 1 в число 40 и при этом траектория вычислений содержит числа 12 и 25?
Траектория должна содержать оба указанных числа. Траектория вычислений — это последовательность результатов выполнения всех команд программы. Например, для программы 212 при исходном числе 7 траектория будет состоять из чисел 14, 15, 30.
Решение. Нужно найти количество программ, которые из 1 получают 12, количество программ, которые из 12 получают 25, количество программ, которые из 25 получают 40, и перемножить найденные значения. Сначала найдём количество программ, получающих 12 из 1.
Обозначим R(n) — количество программ, которые преобразуют число 2 в число n.
Верны следующие соотношения:
1. Если n не делится на 2, то тогда R(n) = R(n – 1), так как существует единственный способ получения n из n − 1 — прибавление единицы.
2. Пусть n делится на 2.
Если n > 1, то R(n) = R(n : 2) + R(n – 1).
Если n = 1, то R(n) = 1 (два способа: прибавление единицы и удвоение).
Теперь можно постепенно вычислить все значения:
R(2) = R(1) + R(1) = 1 + 1 = 2 = R(3);
R(4) = R(2) + R(3) = 2 + 2 = 4 = R(5);
R(6) = R(3) + R(5) = 2 + 4 = 6 = R(7);
R(8) = R(4) + R(7) = 4 + 6 = 10 = R(9);
R(10) = R(5) + R(9) = 4 + 10 = 14 = R(11);
R(12) = R(6) + R(11) = 6 + 14 = 20.
Программ, получающих из числа 12 число 25 достаточно мало, можно их просто перечислить: 21, 1111111111111.
А программа, получающая из числа 25 число 40, всего одна (один способ: добавление единиц).
Таким образом, находим ответ: 
Ответ: 40.
Приведём другое решение на языке Python.
def f(x, y):
if x > y:
return 0
if x == y:
return 1
else:
return f(x + 1, y) + f(x * 2, y)
print(f(1, 12) * f(12, 25) * f(25, 40))
Ответ: 40