
Python
Рекурсия, Последний шаг, Разрыв цепочки рекурсии
Здравствуйте, подскажите, пожалуйста, как будет наиболее рационально решить эту задачу? Правильный ответ: 812266767. Я знаю классическое решение, но кроме того, как мы напишем рекурсию и учтем последний шаг, возникает проблема на числе 11, так как из 10 можно получиться 11, а потом к 11 прибавить еще раз 1. Именно на этом моменте у меня не получается ввести контроль, так как идет две цепочки рекурсии (сначала от 3 до 11, а потом от 11 до конца) что лучше сделать?

А причём здесь рекурсия? Задача решается не рекурсией, а динамическим программированием - с вычислительной сложностью O(n).
# вычисление кол-ва способов получения числа i
# по ранее вычисленному кол-ву способов получения чисел от 0 до i - 1
def step(t, i):
~~if i % 2: t[i] = [t[i - 1][1] + t[i - 2][0], t[i - 2][0]]
~~else: t[i] = [t[i - 1][1] + t[i - 2][0] + t[i // 2][0], t[i - 2][0] + t[i // 2][0]]
# собственно получение результата
t = [[0, 0] for _ in range(80)] # инициализируем массив t
t[3] = [1, 1] # начинаем с числа 3
for i in range(4, 12): step(t, i) # кол-во способов получения чисел от 4 до 11
for i in range(0, 11): t[i] = [0, 0] # удаляем способы, не включающие 11
for i in range(12, 23): step(t, i) # кол-во способов получения чисел от 12 до 22
# кол-во способов получения числа 23 остаётся равным 0
for i in range(24, 80): step(t, i) # кол-во способов получения чисел от 24 до 79
print(t[79][0]) # итого
t[i][0] - кол-во способов получения числа i в которых последней операцией может быть "прибавить 1"
t[i][1] - кол-во способов получения числа i в которых последней операцией НЕ может быть "прибавить 1"
# вычисление кол-ва способов получения числа i
# по ранее вычисленному кол-ву способов получения чисел от 0 до i - 1
def step(t, i):
~~if i % 2: t[i] = [t[i - 1][1] + t[i - 2][0], t[i - 2][0]]
~~else: t[i] = [t[i - 1][1] + t[i - 2][0] + t[i // 2][0], t[i - 2][0] + t[i // 2][0]]
# собственно получение результата
t = [[0, 0] for _ in range(80)] # инициализируем массив t
t[3] = [1, 1] # начинаем с числа 3
for i in range(4, 12): step(t, i) # кол-во способов получения чисел от 4 до 11
for i in range(0, 11): t[i] = [0, 0] # удаляем способы, не включающие 11
for i in range(12, 23): step(t, i) # кол-во способов получения чисел от 12 до 22
# кол-во способов получения числа 23 остаётся равным 0
for i in range(24, 80): step(t, i) # кол-во способов получения чисел от 24 до 79
print(t[79][0]) # итого
t[i][0] - кол-во способов получения числа i в которых последней операцией может быть "прибавить 1"
t[i][1] - кол-во способов получения числа i в которых последней операцией НЕ может быть "прибавить 1"
Похожие вопросы
- Помогите: Задача на Рекурсия
- Необходимо вычислить сумму двух дробей a/v;d/c. Используйте рекурсию, чтобы найти общий знаменатель двух чисел.
- Как вы поняли рекурсию?
- Объясните пожалуйста решение этого выражения, если можно максимально подробно описать каждый шаг. Решение через Python
- Задача: Посчитать и вычислить значение функции у=50/(х²-4) на отрезке от -4 до -7 с шагом -1
- Какой процент счастливых билетов в рулоне? Это когда сумма первых трёх цифр равна сумме последних трех
- Первый элемент списка — 1 буква 'а', последний — 33 буквы 'я'. Используй метод append().
- А легко ли дается последний шаг? Отметим?
- Возник вопрос по решению задачи - точнее непонятен последний шаг почему AK^2 / 3 = BC^2 / 4
- А Вы стояли, когда нибудь на краю обрыва с мыслью сделать последний шаг ? Что Вас удержало от этого шага.?