public class StringReverseAlgorithm {
public static void main(String[] args) {
System.out.println(reverseStringWithRecursion("Как это работает?"));
}
public static String reverseStringWithRecursion(String inputString) {
String rightPart;
String leftPart;
int length = inputString.length();
// заканчиваем рекурсивный обход
if (length <= 1) {
return inputString;
}
Что происходит в следующих 2 строках? Почему мы доходим до среднего символа в leftPart, начинаем с того же среднего символа в rightPart, но символ не дублируется?
leftPart = inputString.substring(0, length / 2);
rightPart = inputString.substring(length / 2, length);
Почему, если мы меняем местами только правую и левую часть, переворачивается вся строка, то есть все символы записываются в обратном порядке?
return reverseStringWithRecursion(rightPart) + reverseStringWithRecursion(leftPart);
}
}
Если вы пишете str.substring(a, b), то вы берёте подстроку с символа с номером a, до символа с номером b - 1, в терминах математики вы указываете полуинтервал [a, b), то есть левый конец включается, а правый нет.
В строках
leftPart = inputString.substring(0, length / 2);
rightPart = inputString.substring(length / 2, length);
вы берёт строку [1 .. n] (это написаны индексы символов) и разваливаете её в две подстроки:
[1 .. n/2 - 1] и [n/2 .. n],
затем каждую из них переворачиваете рекурсивным вызовом, получаются строки
[n/2 - 1 .. 1] и [n .. n/2],
и, меняя местами, склеиваете обратно, получается:
[n .. n/2] + [n/2 - 1 .. 1] = [n .. n/2 n/2 - 1 .. 1] = [n .. 1],
строка в обратном порядке, что и было заявлено.
Дополню ответ zcorvid: В конце мы передаём строку в принимаемое значение, что приводит к тому, что метод выполняется заново и это происходит до тех пор, пока половины строк больше одного символа
Почему мы доходим до среднего символа в leftPart, начинаем с того же среднего символа в rightPart, но символ не дублируется?
Читайте документацию. В классе String метод substring принимает на вход полуоткрытый интервал [а, b). То есть правый край интервала не входит в возвращаемую подстроку. Таким образом, никакого "дублирования символа" тут нет и не должно быть. Символ с индексом length / 2 попадет только в правую подстроку, но не в левую.
Почему, если мы меняем местами только правую и левую часть, переворачивается вся строка, то есть все символы записываются в обратном порядке?
Мы не просто меняем местами правую и левую часть. Мы еще предварительно выполняем рекурсивный вызов той же самой функции reverseStringWithRecursion для правой и левой части в отдельности. В результате правая и левая части переворачиваются. Несложно убедиться, что это приведет к перевороту исходной строки.
Сборка персонального компьютера от Artline: умный выбор для современных пользователей