2017-09-24 67 views
-1

我正在寫一個簡單的GCD函數,我相信它會一直返回一些東西,因爲我在if中寫了一個return語句。如何確保程序不會以編譯錯誤結束。最後寫另一個return語句可以嗎?如何確保你在遞歸函數中返回一些東西?

private static int gcd(long a, long b){ 
    if(b==0) 
     return (int)a; 
    else{ 
     a=a%b; 
     gcd(b,a); 
    } 
    //I want to avoid the next statement as I think it is redundant, 
    //but the compiler does not allow me to skip it. 
    return 0; 
} 
+2

如果正常執行意味着它不應該達到最終返回語句,那麼您可以並且應該拋出異常。 – Michael

+0

有一個@CheckReturnValue註釋,[Google的errorprone](http://errorprone.info/bugpattern/CheckReturnValue)用來確保您使用返回值。 –

+0

@AndyTurner根本不是他要求的 – Michael

回答

1

在else分支,你可能打算使用return gcd(b, a),而不是簡單地調用gcd(b, a)並沒有使用它的結果。

以這種方式,最後不需要使用return 0,因爲所有可能的分支現在都會返回一些東西。

+1

謝謝!由於沒有使用遞歸調用返回的值返回當前調用,所以我犯了一個錯誤。現在我明白了這個錯誤,它也起作用。 :) – Aniket

0

您需要在每個nonvoid函數的每個可能結束處使用return語句。這不是你可以避免的。所以,如果你有一個帶有return語句的if語句,你還需要在函數的每一端都有一個return語句,因爲如果條件沒有被滿足,你的函數將不被編譯器接受,因爲來電者期待回報。

雖然有,如果你需要它,可以不返回0,就像你現在在你的函數中一樣。通常有兩種方式:

  1. 返回NULL(不推薦高)

如果返回null,則是喜歡你什麼都不是給調用者返回。在這種情況下,調用者必須知道,如果滿足某些條件,該函數可能會返回null。

  • 拋出一個異常
  • 你可以拋出一個異常,如果您函數的一些不需要的情況存在。這是更值得推薦的可能性,因爲調用者將不得不承認該函數被調用的狀態不好,調用者的代碼將不得不包含一些try-catch而不是if(returnedObject == null)

    編輯:

    隨着您的意見,我現在已經明白你的困惑是什麼,我現在可以看到問題。你想使一個遞歸調用,但你會與你目前的狀態出現的情況是:

    要麼你將肉停止狀態,然後返回一個鑄造爲int:

    if (b == 0) 
    

    或者你會來else塊並進行遞歸調用:

    gcd(b,a); 
    

    但你不會在你的函數的第二個結果返回遞歸調用的結果,因此,你不會有任何回報,因此編譯器會顯示錯誤。既然你想返回遞歸調用的結果,因爲我認爲,你將不得不改變

    gcd(b,a); 
    

    return gcd(b,a); 
    

    那麼你的編譯器應該被罰款,因爲如果和別的塊都提供了一個return語句。

    +0

    甚至不提選項1.這是可怕的做法。使用可選或拋出異常。 – Michael

    +0

    謝謝伊沃!我還沒有學習例外。 :) – Aniket

    +0

    不客氣!當然,檢查它們,因爲它們在很多方面都非常重要 –

    0

    首先,你錯過的東西,這將解決您的問題,這是returnelse gcd

    private static int gcd(long a, long b) { 
        if (b == 0) 
         return (int) a; 
        else { 
         a = a % b; 
         return gcd(b, a); 
        } 
    } 
    

    值時,也可以刪除else部分是這樣的(因爲return

    private static int gcd(long a, long b) { 
        if (b == 0) 
         return (int) a; 
        a = a % b; 
        return gcd(b, a); 
    } 
    
    // - - - - - - - - - - OR - - - - - - - - - - - - - - - 
    
    private static int gcd(long a, long b) { 
        if (b != 0){ 
         a = a % b; 
         return gcd(b, a); 
        } 
        return (int) a; 
    } 
    
    +0

    這些並不是代碼的縮減,它們只是表達完全相同的東西的不同方式。他們對OP表達方式沒有客觀的改進。 – Michael