我对为什么返回功能不能正常工作更感兴趣。与优化或我的思维方式无关。
我尝试了一个简单的程序来递归检查字符串是否为回文。
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吗?
您能帮我吗?我真的很想知道为什么它会这样:|。
答案 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}}。