2012-01-31 151 views
2

我試圖寫一個遞歸函數,它返回一個數的階乘。如果數字是0或負數,那麼它應該返回0. 但是,每次我測試它,它總是返回0,任何人都可以點亮這個請嗎?遞歸函數 - 一直返回0嗎?

int factorial(int integer) 
{ 
    if(integer <= 0) 
    { 
     return 0; 
    } 

    else 

     return integer* (factorial(integer-1)); 

} 

回答

4

,因爲它使一個自稱整數 - 1,它最終將調用本身與0,那麼你將有一個這樣的電話:

return integer * (factorial(0)) 

將解析爲

return integer * 0 

這是0

+0

感謝您的所有答案,但我被告知,如果輸入0或負數,該方法必須返回0.是否沒有辦法執行該方法? – matt 2012-01-31 20:28:19

+0

當然,只需添加另一個「if」:如果參數爲1,則返回1。 – theglauber 2012-01-31 20:31:06

4

您將通過零在你的基本情況一直繁衍的結果。因子01,而不是0

如果函數必須返回0當輸入小於1

int factorial (int integer) { 
    if (integer < 1) { 
     return 0; 
    } else if (integer == 1) { 
     return 1; 
    } else { 
     return integer * factorial(integer-1); 
    } 
} 

不是最短的實現,但相當的可讀性。

0

您必須返回1,通過0乘以總是返回0

if(integer < 2) 
{ 
    return 1; 
} 
3

你的函數必須在基本情況下返回1,像這樣:

if (integer <= 0) { 
    return 1; 
} 

你乘號和你知道任何數字乘以0是零。你需要使用的是1,乘法標識,因爲任何數字乘以1就是數字本身。

1

只需使用1而不是0.當您使用0時,您將有任何數字將乘以0,返回0.

例如:

5! 5.4.3.2.1 = = 120,而不是5.4.3.2.1.0 = 0

2

試圖執行一個簡單的測試情況下用鉛筆和紙:

main: 
    factorial(3) 
    return 3 * factorial(2) 
     factorial(2) 
     return 2 * factorial(1) 
      factorial(1) 
      return 1 * factorial(0) 
       factorial(0) 
       return 0 
      return 1 * 0 (equals 0) 
     return 2 * 0 (equals 0) 
    return 3 * 0 (equals 0) 

所以,似乎每個遞歸調用到達「 0" 。

嘗試增加這個條件:

else if(integer == 1) 
    return 1; 
1

您允許的整數通過遞歸調用上浮爲零,返回零當它發現整爲零。所以你將你最後一次遞歸調用的結果乘以零。因此,你總是得到一個零作爲答案。