回文字符串的返回不是预期的。背后的机制是什么

时间:2018-08-12 12:12:35

标签: java recursion return-value

我对为什么返回功能不能正常工作更感兴趣。与优化或我的思维方式无关。

我尝试了一个简单的程序来递归检查字符串是否为回文。

package palindrom;

public class PalindromString {

  public static boolean isPalindrom(String myText) {

    char f = myText.charAt(0);
    char l = myText.charAt(myText.length() - 1);

    if (f != l) {
        return false;
    }

    else {

        if (myText.length() > 1) {
            isPalindrom(myText.substring(1, myText.length() - 1));

        } else {
            return true;
        }

    }
    return true;

  }

  public static void main(String[] args) {
    String text = "cococbc";
    System.out.println(isPalindrom(text));
  }
}

第一步,程序将第一个“ c”字符和最后一个字符进行比较,然后再次调用该函数,这次使用“ ococb”字符串。 该函数接受“ o”字符和“ b”,将它们进行比较,发现它们不相等,转到“返回假”;语句,但返回true吗?

您能帮我吗?我真的很想知道为什么它会这样:|。

1 个答案:

答案 0 :(得分:2)

  

看到它们不相等,转到“ return false”;语句,但返回true吗?

是的,isPalindrom("ococb")返回false,但是当该递归调用返回时,您将忽略其返回值,因此isPalindrom("cococbc")返回true。您需要返回isPalindrom(myText.substring(1, myText.length() - 1))才能解决此问题。

除了该问题之外,您还应该更改条件,以要求将myText.length() is at least 3, otherwise you may pass an empty String`递归调用,因为您要删除第一个和最后一个字符。

    if (myText.length() >= 3) {
        return isPalindrom(myText.substring(1, myText.length() - 1));
    } else {
        return true;
    }

进行更改后,您应该删除最后的return true;,它将不再可用。

您还可以考虑在开始时添加对null或空String的检查,以使您的方法在被调用null或空{时不会引发异常{1}}。