这个Palindrome功能有什么问题

时间:2016-04-22 14:05:15

标签: java recursion palindrome

我使用Recursion在Java中编写了回文函数,但是它错误地打印了结果。

php app/console cache:clear --env=prod

输出:

public static boolean isPalindrome(String test) {
        if(test.length() == 1 || test.equals("")) {
            System.out.println("Length is one");
            return true;

        } 

        if (test.charAt(0) == test.charAt(test.length() - 1)) {
            System.out.println("Length is one 111 a");
            isPalindrome(test.substring(1,test.length() -1)) ;      
        } 
        System.out.println("Length is one 111");
        return false;
    }

    public static void main(String args[]) {
        if(isPalindrome("rotor"))
            System.out.println(" Rotor is a palindrome");
        else
            System.out.println(" Rotor is not a palindrome");
        //System.out.println(isPalindrome("rotor"));
        //System.out.println(isPalindrome("motor"));
        //System.out.println(isPalindrome("a"));

    }

3 个答案:

答案 0 :(得分:2)

您遗漏了return内的if声明。没有它,除了一个或零个字符的字符串之外的任何字符最终都会返回false

public static boolean isPalindrome(String test) {
    if(test.length() <= 1) { // A more elegant check
        return true;
    } 

    if (test.charAt(0) == test.charAt(test.length() - 1)) {
        // "return" was missing here
        return isPalindrome(test.substring(1, test.length() -1)) ;      
    } 
    return false;
}

答案 1 :(得分:1)

你的问题主要源于糟糕的解决方案技巧。递归是解决这个问题的次优方法 - 考虑一下JVM必须创建的所有堆栈帧!如果你能够放弃这种方法,并愿意牺牲性能来简洁,那么使用

return test.equalsNoCase(new StringBuilder(test).reverse().toString());

显然更容易维护(尽管这将创建两个额外的对象执行两倍于严格必要的字符比较)。如果您认为案例对于回文性很重要,请使用equals

答案 2 :(得分:1)

你必须在这里添加回报:

if (test.charAt(0) == test.charAt(test.length() - 1)) {
            System.out.println("Length is one 111 a");
            return isPalindrome(test.substring(1,test.length() -1)) ;
        }
        System.out.println("Length is one 111");
        return false;

如果你不这样做,它将在你完成最后一次测试后继续执行(在你的情况下为字符串&#34; t&#34;)并且它将以return false结束。