[英]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.