Java 递归回文;索引越界

Java 递归回文;索引越界,java,recursion,palindrome,Java,Recursion,Palindrome,我试图编写一个函数来检查字符串变量是否是回文。 我找不到此代码引发IndexOutOfBoundException的原因。我尝试使用示例来跟踪结果,但我仍然看不出异常来自何处 public static boolean palindrome(String s) { if (s.charAt(0) == s.charAt(s.length() - 1)) { if (s.length() > 2) { StdOut.print(s

我试图编写一个函数来检查字符串变量是否是回文。 我找不到此代码引发
IndexOutOfBoundException
的原因。我尝试使用示例来跟踪结果,但我仍然看不出异常来自何处

public static boolean palindrome(String s) {
    if (s.charAt(0) == s.charAt(s.length() - 1)) {
        if (s.length() > 2) {       
            StdOut.print(s.substring(1, s.length() - 2));
            palindrome(s.substring(1, s.length() - 2));
        } else
            return true;
    }
    return false;
}

回文
可能会以一个空字符串结束对自身的调用。发生这种情况时,在
s.charAt(0)
中,带有的第一行给出一个
IndexOutOfBoundsException


另外,仔细检查,
子字符串
调用中的边界也不正确:因为结束索引是独占的,第二个参数应该是
S.length()-1
。你也需要解决这个问题。

回文
最终可能会用一个空字符串调用自己。发生这种情况时,在
s.charAt(0)
中,带有的第一行给出一个
IndexOutOfBoundsException


另外,仔细检查,
子字符串
调用中的边界也不正确:因为结束索引是独占的,第二个参数应该是
S.length()-1
。您也需要修复它。

您的子字符串错误。您正在从末尾删除一个额外的字符

public static boolean palindrome(String s) {
    if (s.charAt(0) == s.charAt(s.length() - 1)) {
        if (s.length() > 2) {       
            StdOut.print(s.substring(1, s.length() - 1));
            palindrome(s.substring(1, s.length() - 1));
        } else
            return true;
    }
    return false;
}

你的子字符串是错误的。您正在从末尾删除一个额外的字符

public static boolean palindrome(String s) {
    if (s.charAt(0) == s.charAt(s.length() - 1)) {
        if (s.length() > 2) {       
            StdOut.print(s.substring(1, s.length() - 1));
            palindrome(s.substring(1, s.length() - 1));
        } else
            return true;
    }
    return false;
}

这里有几个问题:

  • 如前所述,
    substring
    调用是错误的,
    endIndex
    是独占的,因此应该以
    s.length()-1)
  • 您正在调用
    palindrome
    ,然后继续使用函数,最终返回
    false
    ——相反,您应该返回应用于子字符串的
    palindrome
    的结果:
  • 因此,在考虑了这两个错误后,该方法应如下所示:

    public static boolean palindrome(String s) {
        if (s.charAt(0) == s.charAt(s.length() - 1)) {
            if (s.length() > 2) {
                // note the return and the corrected substring
                return palindrome(s.substring(1, s.length() - 1));
            } else
                return true;
        }
        return false;
    }
    

    这里有几个问题:

  • 如前所述,
    substring
    调用是错误的,
    endIndex
    是独占的,因此应该以
    s.length()-1)
  • 您正在调用
    palindrome
    ,然后继续使用函数,最终返回
    false
    ——相反,您应该返回应用于子字符串的
    palindrome
    的结果:
  • 因此,在考虑了这两个错误后,该方法应如下所示:

    public static boolean palindrome(String s) {
        if (s.charAt(0) == s.charAt(s.length() - 1)) {
            if (s.length() > 2) {
                // note the return and the corrected substring
                return palindrome(s.substring(1, s.length() - 1));
            } else
                return true;
        }
        return false;
    }
    
    试试这个:

    public static boolean palindrome(String s)
    {
        if (s.length() < 2)
            return true;
        if (s.charAt(0) != s.charAt(s.length()-1))
            return false;
        return palindrome(s.substring(1,s.length()-1));
    }
    
    公共静态布尔回文(字符串s)
    {
    如果(s.长度()<2)
    返回true;
    如果(s.charAt(0)!=s.charAt(s.length()-1))
    返回false;
    返回回文(s.substring(1,s.length()-1));
    }
    
    试试这个:

    public static boolean palindrome(String s)
    {
        if (s.length() < 2)
            return true;
        if (s.charAt(0) != s.charAt(s.length()-1))
            return false;
        return palindrome(s.substring(1,s.length()-1));
    }
    
    公共静态布尔回文(字符串s)
    {
    如果(s.长度()<2)
    返回true;
    如果(s.charAt(0)!=s.charAt(s.length()-1))
    返回false;
    返回回文(s.substring(1,s.length()-1));
    }
    
    查看异常的堆栈跟踪。它确切地告诉您它发生在哪一行,以及无效的索引值是什么。我没有提到的另一个问题是,您忽略了递归调用的结果-我相信您希望返回此结果。请查看异常的堆栈跟踪。它确切地告诉您它发生在哪一行,以及无效的索引值是什么。我没有提到的另一个问题是,您忽略了递归调用的结果-我相信您希望返回它。实际上,字符串应该至少是1个图表。非常感谢您。我没有理解你所说的第一部分,是的,最后一个调用将是s.charAt(0),但是条件:s.charAt(0)=s.charAt(s.length()-1)可以检查:实际上字符串应该至少是1个chart非常感谢你。我没有理解你所说的第一部分,是的,最后一个调用将是s.charAt(0),但是条件:s.charAt(0)=s.charAt(s.length()-1)可以检查:
    charAt(0)
    应该是
    s.charAt(0)
    @bcsb1001:yes,必须在粘贴问题的过程中滑出。谢谢:)谢谢,它帮助我理解了条件的顺序。
    charAt(0)
    应该是
    s.charAt(0)
    @bcsb1001:Yep,一定是在复制粘贴过程中从问题中漏掉的。谢谢:)谢谢,它帮助我了解了条件的顺序。