user3670665
user3670665

Reputation: 1

Palindrome tester

So I have the majority of the code written and it works. Except for the iterative method keeps showing that it is not a palindrome regardless of what is typed in. I am at a loss as to how to remedy it here is the code.

//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;
}

}

Upvotes: 0

Views: 972

Answers (3)

Jason S
Jason S

Reputation: 13779

Your iterative method does not set result = true anywhere, so it really can't help it. Although I think the iterative method could be better overall. Take a close look at what is happening in the recursive one and see if you can implement some of it (like the guard conditions) more closely in the iterative method, and keep in mind that you are not limited to a single index value in a for loop either. e.g.:

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;
}

Upvotes: 2

Chris Martin
Chris Martin

Reputation: 30736

I'm guessing someone once told you that a function should only have one return point, and trying to follow that led you to using a mutable result variable which screwed you here. Using break poses the same ostensible problem anyway. Save yourself the headache and just return as soon as you know the answer.

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;
}

Upvotes: 0

Adriano
Adriano

Reputation: 1723

Your iterative method never sets result to be true. Here's a modified version:

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;
}

Upvotes: 2

Related Questions