簡體   English   中英

遞歸方法:為什么我需要return語句?

[英]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行。

  1. palChecker("ABCBA")執行palChecker("BCB")
  2. palChecker("BCB")執行palChecker("C")
  3. palChecker("C")執行return true
  4. palChecker("BCB")收到的是true但是如果你錯過了return語句,它就不會返回它; 它移動到return false的下一行代碼
  5. palChecker("ABCBA")接收到false但是如果你錯過了return語句,它將移動到下一行代碼, return false
  6. 最終結果是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。

考慮一下,函數確實會以遞歸方式執行,但最后,它只是返回一個你不會使用truefalse值,然后程序將返回調用堆棧,只返回false最終使你的方法總是返回false(除非s.length()==1 || s.length()==0在第一次調用時為真)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM