Исполнитель Удвоитель преобразует число на экране. У исполнителя есть две команды, которым присвоены номера:- Прибавить 1
- Умножить на 2
Первая команда увеличивает число на экране на 1, вторая умножает его на 2. Программа для исполнителя Удвоитель— это последовательность команд. Сколько существует программ, для которых при исходном числе 3 результатом является число 25 и при этом траектория вычислений содержит число 11 и не содержит числа 20? Траектория вычислений программы— это последовательность результатов выполнения всех команд программы.
Источник: ссылка
|
|
Все типы этого задания решаются одинаково: мы создаём рекурсивную функцию с 3-я условиями.
- Если перепрыгнули результат (а так как у нас нет ни одной команды, которая как либо уменьшает это число, поэтому перешагнуть результат уже неправильно) или наткнулись на число, которое траектория не допускает, то возвращаем 0, потому что такой программы нет!
- Если попали идеально в необходимое число, то возвращаем 1, потому что одна такая программа нашлась.
- Во всех остальных случаях (то есть те, когда мы ещё меньше нужного нам числа) вызываем эту же функцию.
Так как нам необходимо, чтобы траектория вычислений содержала 11, мы вызываем функцию “от 3 до 11 и от 11 до 25”.
Необходимо запомнить, что в самой функции (строка 11) между двумя вызовами мы пишем плюс (функции возвращают числа, поэтому с ними можно легко проводить математические операции), а в итоговом старте программы (строка 13) мы пишем умножение.
#Задание 23
def f(x, res):
#Если мы ушли дальше, чем рузультат или наткнулись на 20
if x > res or x == 20:
return 0
#Если мы наткнулись на результат
elif x == res:
return 1
#Все остальные случаи
else:
return f(x + 1, res) + f(x * 2, res)
print(f(3, 11) * f(11, 25))