【问题标题】:Recursive method in java to detect a palindromejava中的递归方法检测回文
【发布时间】:2015-09-09 10:13:36
【问题描述】:

我正在尝试跟踪检测单词是否为回文的递归方法:

public static boolean isPalindrome(String word) {
    if (word.length() == 0 || word.length() == 1) {
        return true; 
    } else if (word.charAt(0) == word.charAt(word.length() - 1)) {
        return isPalindrome(word.substring(1, word.length() - 1)); 
    } else {
        return false;
    } 
}

我用过的词是:“abba”。该方法的第一个实例采用 else 方式,因为第一个 if 条件的求值,所以它求值 if else 语句中的条件,得到一个 true 作为结果,然后该方法返回带有单词“bb”的方法的运行.递归再次运行该方法:“bb”的长度不是0或1,则采用else方式,并评估第一个'b'是否等于第二个'b',为真,因此返回运行再次使用相同的方法,但现在有一个子字符串,该子字符串从位置 1 (beginIndex) 'b' 的字符开始,到位置 0 (endIndex) 的字符结束,但 beginIndex 大于 endIndex,这应该引发 IndexOutOfBoundsException 。 ..但是该方法有效。有人可以向我解释一下吗?谢谢

【问题讨论】:

  • 我已对您的代码进行了格式设置以提高可读性,但将来我强烈建议您自己执行此操作。格式化非常重要,因为如果您的代码不是标准可接受的格式,那么它的可读性就不是很好,如果它不可读,那么就无法理解。

标签: java recursion palindrome


【解决方案1】:

在您的第二次迭代中,这个词是bb。这意味着长度是2。

您的子字符串是word.substring(1, 1)。因此它不会(并且正确地)抛出异常,而是返回一个空字符串。

【讨论】:

  • 谢谢 CodeBender,就是这样
【解决方案2】:

添加一些println可以帮助你调试,检查here。

public static boolean isPalindrome(String word){
    System.out.println("Checking "+word+" length: "+word.length());
    if(word.length()==0 || word.length()==1){
        System.out.println("Base Case");
        return true; 
    } else if(word.charAt(0)==word.charAt(word.length()-1)){
        System.out.println("Resursive case substring(1,"+(word.length()-1)+")");
        return isPalindrome(word.substring(1, word.length()-1)); 
    }else {
        return false;
    } 
}

Checking abba length: 4
Resursive case substring(1,3)
Checking bb length: 2
Resursive case substring(1,1)
Checking  length: 0
Base Case

正如您在第二次递归调用中看到的那样,您拥有"bb",并且您将检查substring(1,1),文档指出:

IndexOutOfBoundsException - 如果 beginIndex 为负数,或者 endIndex 大于此 String 对象的长度,或者 beginIndex 大于 endIndex。

beginIndex is not > than endIndex 所以不会抛出异常。您可以通过解释

来说子字符串在索引 1 处的字符之后开始并在索引 0 处的字符之后结束

返回一个新字符串,它是该字符串的子字符串。子字符串从指定的 beginIndex 开始并延伸到索引 endIndex - 1 处的字符。因此子字符串的长度是 endIndex-beginIndex。

|      b       |       b      |
                ^
                beginIndex (starts at 1)
              ^
              endIndex - 1 (ends past 0)

【讨论】:

  • 谢谢你,杰克,我对解释很满意
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-11-02
  • 1970-01-01
  • 1970-01-01
  • 2021-09-12
  • 2014-06-12
  • 2015-07-22
相关资源
最近更新 更多