Тип 23 № 17340 

Оператор присваивания и ветвления. Перебор вариантов, построение дерева. Количество программ с обязательным и избегаемым этапами
i
Исполнитель РазДваПять преобразует число на экране.
У исполнителя есть три команды, которым присвоены номера.
1. Прибавить 1.
2. Умножить на 2.
3. Прибавить 5.
Первая команда увеличивает число на экране на 1, вторая умножает его на 2, третья увеличивает на 5.
Программа для исполнителя РазДваПять — это последовательность команд.
Сколько существует программ, которые преобразуют исходное число 1 в число 16, и при этом траектория вычислений содержит число 8 и не содержит числа 10?
Траектория вычислений — это последовательность результатов выполнения всех команд программы. Например, для программы 312 при исходном числе 4 траектория будет состоять из чисел 9, 10, 20.
Решение. Искомое количество программ равно количеству программ, получающих из числа 1 число 16. Траектория вычислений не должна содержать числа 10 и должна содержать число 8.
Пусть R(n) — количество программ, которые число 1 преобразуют в число n.
Верно следующее соотношение:
R(n) = R(n – 1) + R(n : 2) (если n чётно) + R(n – 5).
R(2) = 2;
R(3) = 2;
R(4) = 4;
R(5) = 4;
R(6) = 7;
R(7) = 9;
R(8) = 15;
R(9) = 15;
R(10) = 0;
R(11) = 0;
R(12) = 0;
R(13) = 15;
R(14) = 30;
R(15) = 30;
R(16) = 45.
Таким образом, количество программ, удовлетворяющих условию задачи, равно 45.
Ответ: 45.
Приведем другое решение.
Количество программ, преобразующих число 1 в число 16 таким образом, чтобы траектория вычислений содержала число 8, равно произведению количества программ, преобразующих число 1 в число 8, и количества программ, преобразующих число 8 в число 16.
Найдем количество программ, преобразующих число 1 в число 8, используя соотношение
R(n) = R(n – 1) + R(n : 2) (если n чётно) + R(n – 5).
R(2) = 2;
R(3) = 2;
R(4) = 4;
R(5) = 4;
R(6) = 7;
R(7) = 9;
R(8) = 15.
Программ, преобразующих число 8 в число 16 так, чтобы траектория вычислений не содержала число 10, всего 3, их можно перечислить: 2, 1311, 3111.
Следовательно, количество программ, преобразующих число 1 в число 16, равно 15 · 3 = 45.
Приведём другое решение на языке Python.
def f(x, y):
if x > y or x == 10:
return 0
if x == y:
return 1
else:
return f(x + 1, y) + f(x * 2, y) + f(x + 5, y)
print(f(1, 8) * f(8, 16))
Приведём решение Виктории Сапроновой на языке С с использованием компилятора GCC(code::blocks).
#include int count_trs(int from, int to)
{
if (from > to || from == 10)
{
return 0;
}
if (from == to)
{
return 1;
}
int result = count_trs(from + 1, to) + count_trs(from * 2, to) + count_trs(from + 5, to);
return result;
}
int main()
{
int count = count_trs(1, 8) * count_trs(8, 16);
printf("%d\n", count);
return 0;
}
Ответ: 45