Тестер палиндрома

Итак, у меня написана большая часть кода, и он работает. За исключением итеративного метода, который постоянно показывает, что это не палиндром, независимо от того, что вводится. Я не понимаю, как исправить это, вот код.

//David Crouse Assignment 2
import java.util.Scanner;


public class Assignment2 {

public static boolean loop = false;
//main
public static void main(String[] args) {
    Scanner input = new Scanner(System.in);
    System.out.println("Welcome to the Palindrome Checker!");
    do{
        System.out.print("Enter a string to check if it is a palindrome. ");
        System.out.print("Enter x to exit.");
        String word = input.nextLine();
        word = word.replaceAll("\\s","");
        word = word.toLowerCase();
        //Exit Program
        if(word.equalsIgnoreCase("x")){
            System.out.println("End of program. Good Bye!");
            System.exit(0);
        }
        if(iterativePalindromeChecker(word)){
            System.out.println("Iterative Result: Palindrome!");
        }else{
            System.out.println("Iterative Result: Not a palindrome");
        }
        if(recursivePalindromeChecker(word)){
            System.out.println("Recursive Result: Palindrome!\n");
        }else{
            System.out.println("Recursive Result: Not a palindrome\n");
        }

        loop = true;
    }while (loop == true);
}
//Iterative Method
public static boolean iterativePalindromeChecker(String str){
    boolean result = false;

    int length  = str.length();
    int i, begin, end, middle;

    begin  = 0;
    end    = length - 1;
    middle = (begin + end)/2;

    for (i = begin; i <= middle; i++) {
        if (str.charAt(begin) == str.charAt(end)) {
            begin++;
            end--;
        }
        else {
            break;
        }
    }
    if (i == middle + 1) {
        result = false;
    }
    return result;

}


//Recusive Methods
public static boolean recursivePalindromeChecker(String str){
    if(str.length() == 0 || str.length() == 1)
        return true;
    if(str.charAt(0) == str.charAt(str.length()-1))
        return recursivePalindromeChecker(str.substring(1,str.length()-1));
    return false;
}

}


person user3670665    schedule 30.07.2014    source источник


Ответы (3)


Ваш итеративный метод никогда не устанавливает result в значение true. Вот модифицированная версия:

public static boolean iterativePalindromeChecker(String str){   
    int length  = str.length();
    int i, begin, end, middle;

    begin  = 0;
    end    = length - 1;
    middle = (begin + end)/2;

    for (i = begin; i <= middle; i++) {
        if (str.charAt(begin) == str.charAt(end)) {
            begin++;
            end--;
        }
        else {
            return false;
        }
    }
    return true;
}
person Adriano    schedule 30.07.2014

Ваш итеративный метод нигде не устанавливает result = true, так что ничего не может с этим поделать. Хотя я думаю, что итеративный метод в целом мог бы быть лучше. Внимательно посмотрите, что происходит в рекурсивном методе, и посмотрите, сможете ли вы реализовать некоторые из них (например, условия защиты) более подробно в итеративном методе, и имейте в виду, что вы не ограничены одним значением индекса в для цикла тоже. например.:

public static boolean iterativePalindromeChecker(String str) {
    for(int start = 0, end = str.length() - 1; start < end; start++, end--) {
        if(str.charAt(start) != str.charAt(end)) {
            return false;
        }
    }
    return true;
}
person Jason S    schedule 30.07.2014

Я предполагаю, что кто-то однажды сказал вам, что функция должна иметь только одну точку возврата, и попытка следовать этому привела к использованию изменяемой переменной result, которая вас здесь облажала. В любом случае использование break создает ту же мнимую проблему. Избавьте себя от головной боли и возвращайтесь, как только узнаете ответ.

public static boolean iterativePalindromeChecker(String str) {

    int begin = 0;
    int end = str.length() - 1;

    while (begin < end) {
        if (str.charAt(begin) != str.charAt(end)) {
            return false;
        }
        begin++;
        end--;
    }
    return true;
}
person Chris Martin    schedule 30.07.2014