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
для правой и левой части в отдельности. В результате правая и левая части переворачиваются. Несложно убедиться, что это приведет к перевороту исходной строки.
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Создал пустой проект в intelijiIdea "Hello, Word", решил подключиться к серверу через боковую панельку DataBase -> + -> Data Source -> MySQLДанные для подключения ввел...
Приложение выполняет деление в столбик и выводит весь процесс в консольвсе работает, тесты проходит, проблема в том что при запуске теста...