Функция в java всегда возвращает true

257
13 июня 2018, 20:00

При выполнении кода, на проверку, является ли строка палиндромом, попадаю на ситуацию, что при любом корректном определении несоответствия строки условиям палиндрома, получаю сначала верное сообщение, что строка им не является (это срабатывает внутри 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("Танцуем, мы нашли палиндром!");
}

}

Answer 1

Нельзя, рекурсивно вызывая функцию, игнорировать возвращаемое значение. Вы же ее для того и вызываете, чтобы получить ее результат.

И не выводите никаких сообщений внутри функции 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));

READ ALSO
лямбда выражение в сортировке

лямбда выражение в сортировке

Стоит задача отсортировать все буквы в строке по алфавитуПрограмма должна игнорировать регистр при сортировке

198
Проблема с Intellij Idea

Проблема с Intellij Idea

Всем привет, проблема с IDEПочему-то как-то странно стали располагаться папки, в смысле папка resource автоматически стала пытаться стать root папкой

206
Поддержка нескольких языков

Поддержка нескольких языков

Нужно создать объект(Возможно даже для каждого языка отдельный класс) который хранит в себе все сообщенияПри нужде выводить пользователю...

223
Правильно получить приходящее время

Правильно получить приходящее время

С сервера приходит ответ в котором указано время в путиСуть в том, что иногда приходит в таком виде 45 ( то есть понимается что 45 минут) А иногда...

220