При выполнении кода, на проверку, является ли строка палиндромом, попадаю на ситуацию, что при любом корректном определении несоответствия строки условиям палиндрома, получаю сначала верное сообщение, что строка им не является (это срабатывает внутри else в функции), а затем ошибочное, что строка им является (это срабатывает else в теле основной программы).
Понимаю, что дело где-то в финальном return, но что не так, не могу определить.
Задача дана с обязательным использованием логической рекурсивной функции без циклов, поэтому другие варианты реализации, к сожалению, не подходят.
Выдает вот так, например: Введите строку: 1231 К большому сожалению, введенная строка не является палиндромом Танцуем, мы нашли палиндром!
package com.company;
import java.util.Scanner;
public class Main {
public static boolean palindrom(boolean prov, String str, int i, int len){
//если к середине строки мы не выпали по несовпадающим символам, значит нашли палиндром
if (len - 1 <= i) {
System.out.println("Танцуем, мы нашли палиндром!");
return prov = true;
}
//если символы по указателю счетчиков совпали, то уходим в рекурсию
if (str.charAt(i) == str.charAt(len - 1))
palindrom(prov, str, i + 1, len - 1);
//если не совпали, то строка не является палиндромом
else {
System.out.println("К большому сожалению, введенная строка не является палиндромом");
return prov = false;
}
return prov;
}
public static void main(String[] args) {
//вводные
System.out.println("Программа считывает строку и проверяет, является ли она палиндромом. Программа не чувствительна к регистру, но чувствительно к знакам пунктуации.");
System.out.println();
//считываем строку, готовим переменные
System.out.print("Введите строку: ");
Scanner scan = new Scanner(System.in);
String str = scan.nextLine();
str = str.replaceAll("\\s","");
str = str.toLowerCase();
int len = str.length();
int i = 0;
boolean prov = true;
//если строка пустая или содержит 1 символ, или функция вернула ложь, то не палиндром
if (len <= 1 || palindrom(prov, str, i, len) == false)
System.out.print("К большому сожалению, введенная строка не является палиндромом");
//иначе палиндром
else
System.out.println("Танцуем, мы нашли палиндром!");
}
}
Нельзя, рекурсивно вызывая функцию, игнорировать возвращаемое значение. Вы же ее для того и вызываете, чтобы получить ее результат.
И не выводите никаких сообщений внутри функции palindrom. Ее задача - определить палиндром строка или нет.
public static boolean palindrom(String str, int i, int len){
if (len - 1 <= i) {
return true;
}
if (str.charAt(i) == str.charAt(len - 1)) {
return palindrom(str, i + 1, len - 1); // !!!
}
return false;
}
function palindrom(str, i, len) {
if (len - 1 <= i) {
return true;
}
if (str[i] == str[len - 1]) {
return palindrom(str, i + 1, len - 1); // !!!
}
return false;
}
var str1 = "arozaupalanalapuazora";
var str2 = "arozaupalWWanalapuazora";
console.log(palindrom(str1, 0, str1.length));
console.log(palindrom(str2, 0, str2.length));
console.log(palindrom("1231", 0, "1231".length));
Апостиль в Лос-Анджелесе без лишних нервов и бумажной волокиты
Основные этапы разработки сайта для стоматологической клиники
Продвижение своими сайтами как стратегия роста и независимости