13. Анализ хода исполнения алгоритма: #295616
Исполнитель преобразует число на экране. У исполнителя есть две команды, которые обозначены латинскими буквами:
A. Вычти $2$
B. Найди целую часть от деления на $2$
Программа для исполнителя – это последовательность команд.
Сколько существует программ, для которых при исходном числе $30$ результатом является число $1$ и при этом траектория вычислений содержит число $12$?
Траектория вычислений программы – это последовательность результатов выполнения всех команд программы. Например, для программы ABB при исходном числе $13$ траектория состоит из чисел $11$, $5$, $2$.
Так как все команды только уменьшают число, любая траектория, содержащая $12$, разбивается на две части: $30\rightarrow12\rightarrow1$.
Посчитаем количество программ от $30$ до $12$ и от $12$ до $1$.
def f(x, y):
if x == y:
return 1
if x < y:
return 0
return f(x - 2, y) + f(x // 2, y)
print(f(30, 12) * f(12, 1))
Функция $f(x, y)$ считает количество программ, переводящих число $x$ в число $y$.
Количество путей:
$30\rightarrow12$: $3$,
$12\rightarrow1$: $13$.
$3\cdot13=39$.
Программа выведет: $39$.