Для любой рекурсивной задачи нам нужен 1) один шаг, который приближает нас к решению, 2) рекурсивный вызов для меньшей задачи и 3) базовый случай, из которого мы можем немедленно вернуться.
Я предлагаю, чтобы единственным шагом было поменять местами первый и последний символы, одновременно передавая все внутренние символы в рекурсивный вызов.
def reverse_recurse(forward):
return forward[last] +
reverse_recurse(forward[second .. one_before_last]) +
forward[0]
Итак, reverse_recurse("abcd")
возвращает d + reverse_recurse(bc) + a
.
В нашем базовом случае вообще не должно быть работы. Если исходная строка имеет четное количество символов, тогда базовый случай - это когда переданная строка forward
является пустой строкой. Если исходная строка имеет нечетное количество символов, базовый случай - это, когда вход forward
имеет один символ (средний символ из исходной строки).
def reverse_recurse(forward):
if forward.len() is 0 or 1:
return forward
return forward[last] +
reverse_recurse(forward[second .. one_before_last]) +
forward[0]
Если вы понимаете, что я предложил, вы можете реализовать это на C ++. (Подсказка: std::string::substr()
существует.)
РЕДАКТИРОВАТЬ 1
В комментариях SergeyA предлагает более простую альтернативу. Единственный шаг - выделить последний символ, и рекурсивный вызов выполняется для строки «все, кроме самого последнего»:
def reverse_recurse(forward):
if forward.len() is 0 or 1:
return forward
return forward[last] +
reverse_recurse(forward[first .. one_before_last])
РЕДАКТИРОВАТЬ 2
Теперь, так как крайний срок выполнения домашних заданий пройден, вот моя реализация.
string reverse_recurse(string forward) {
if (forward.size() == 0)
return forward;
return reverse_recurse(forward.substr(1)) + forward.substr(0, 1);
}