![](/img/trans.png)
[英]Why do i need an additional return statement in a method when using if-else and all possible conditions are met
[英]Recursive method: why do I need return statement?
只是为了练习递归,我写了一个经典的介绍递归函数 - 一个检查给定字符串是否是回文。
我的问题是:在第一个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;
}
您需要返回PalChecker
最终返回的值。
Java函数的定义是它总是返回一个值...即使它是递归中最深点的链,最后将true或false带到顶部。
如果你错过了return palChecker
,那么除非s
的长度为0或1,否则它永远不会返回true
。因为当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;
}
}
如果没有这个return
语句,你的palChecker
几乎总会返回false。
考虑一下,函数确实会以递归方式执行,但最后,它只是返回一个你不会使用的true或false值,然后程序将返回调用堆栈,只返回false最终使你的方法总是返回false(除非s.length()==1 || s.length()==0
在第一次调用时为真)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.