为了练习递归,我写了一个经典的介绍递归函数 - 一个检查给定字符串是否是回文的。
我的问题是:在第一个if语句中,为什么我必须编写return palChecker(...)
而不是palChecker(...)
?在我看来,函数应该没有第一个return语句。但是从测试中我知道这不是真的,但我不清楚原因。
(顺便说一句,打印语句就在那里,所以我可以看到测试过程中发生了什么。我喜欢看到每条执行线。)
public static boolean palChecker(String s){
if ( s.charAt(0)==s.charAt(s.length()-1) && s.length()>1){
System.out.println(s);
return palChecker(s.substring(1,s.length()-1)); //why do i need the return here?
}
else if (s.length()==1 || s.length()==0){
System.out.println(s);
return true;
}
return false;
}
答案 0 :(得分:5)
您需要返回PalChecker
最终返回的值。
Java函数的定义是它总是返回一个值......即使它是递归中最深点的链,最终将真或假带到顶端。
答案 1 :(得分:3)
如果您遗漏return palChecker
,那么除非true
的长度为0或1,否则永远不会返回s
。因为当palChecker以递归方式发现答案为true
时,没有办法让它把这个发现还给你;当递归返回时,它将转到return false
行。
palChecker("ABCBA")
执行palChecker("BCB")
palChecker("BCB")
执行palChecker("C")
palChecker("C")
执行return true
palChecker("BCB")
收到true
但是如果你错过了return语句,它就不会返回它;它移动到下一行代码return false
palChecker("ABCBA")
收到false
,但如果您错过了return语句,则会移到下一行代码return false
false
更清楚的是,您是否可以使用显式else
重写。
public static boolean palChecker(String s){
if (s.length()==1 || s.length()==0){
System.out.println(s);
return true;
}
// at this point s.length() > 1
if (s.charAt(0)==s.charAt(s.length()-1)){
System.out.println(s);
return palChecker(s.substring(1,s.length()));
}
else {
// mismatch
return false;
}
}
答案 2 :(得分:-1)
如果没有此return
语句,您的palChecker
几乎总会返回false。
考虑一下,该函数确实会以递归方式执行,但最后,它只会返回一个 true 或 false 值 wouldn& #39; t ,程序将返回调用堆栈,只返回 false ,最终使您的方法始终返回false(第一次调用时s.length()==1 || s.length()==0
为真) )。