#java #algorithm #recursion #palindrome
#java #алгоритм #рекурсия #палиндром
Вопрос:
Я попытался использовать рекурсию для решения проблемы с палиндромом. Я получил исключение в потоке «main» java.lang.Ошибка StackOverflowError в java.lang.Строка.подстрока(String.java:1969) в Main.isPalindrome(Main.java:160)
Однако я не знаю, как это исправить.
public static boolean isPalindrome(String s) {
int len = s.length();
if (len <= 1) return true;
else {
char ch1 = Character.toLowerCase(s.charAt(0));
char ch2 = Character.toLowerCase(s.charAt(len - 1));
boolean check1 = Character.isLetter(ch1) || Character.isDigit(ch1);
boolean check2 = Character.isLetter(ch2) || Character.isDigit(ch2);
if (check1 amp;amp; check2) {
if (ch1 == ch2) {
String shorter = s.substring(1, len - 1);
return isPalindrome(shorter);
}
else {
return false;
}
}
else if (!check1 amp;amp; check2) {
String shorter = s.substring(1);
return isPalindrome(shorter);
}
else if (!check2 amp;amp; check1) {
String shorter = s.substring(0, len - 1);
return isPalindrome(shorter);
}
else {
String shorter = s.substring(1, len - 1);
return isPalindrome(shorter);
}
}
}
Комментарии:
1. здесь ваш код предполагает, что входная строка будет нечетной длины. Проверьте, равна ли длина 2 и в начальном блоке, а затем проверьте 0-ю и 1-ю позиции
2. Я попробовал System.out.print(isPalindrome(«sb, bbs»)); System.out.print(isPalindrome(«, bbs»)); System.out.print(isPalindrome(«sbbs»));
3. Но все они верны
Ответ №1:
В вашей логике нет ничего плохого. Просто существует ограниченный объем памяти для хранения кадров стека и, следовательно, ограниченное количество уровней рекурсии. Когда StackOverflowError
будет выброшена достаточно большая входная строка.
Я предлагаю отказаться от этой рекурсивной реализации и вместо этого использовать цикл.
Ответ №2:
Трудно сказать, не зная точно, какая строка равна 160. Тем не менее, вы, вероятно, вызываете это с теми же аргументами, что и сам метод, и, следовательно, нет ничего, что могло бы положить конец вашей рекурсии.