我試圖寫一個遞歸函數,它返回一個數的階乘。如果數字是0或負數,那麼它應該返回0. 但是,每次我測試它,它總是返回0,任何人都可以點亮這個請嗎?遞歸函數 - 一直返回0嗎?
int factorial(int integer)
{
if(integer <= 0)
{
return 0;
}
else
return integer* (factorial(integer-1));
}
我試圖寫一個遞歸函數,它返回一個數的階乘。如果數字是0或負數,那麼它應該返回0. 但是,每次我測試它,它總是返回0,任何人都可以點亮這個請嗎?遞歸函數 - 一直返回0嗎?
int factorial(int integer)
{
if(integer <= 0)
{
return 0;
}
else
return integer* (factorial(integer-1));
}
,因爲它使一個自稱整數 - 1,它最終將調用本身與0,那麼你將有一個這樣的電話:
return integer * (factorial(0))
將解析爲
return integer * 0
這是0
您將通過零在你的基本情況一直繁衍的結果。因子0
是1
,而不是0
。
如果函數必須返回0
當輸入小於1
:
int factorial (int integer) {
if (integer < 1) {
return 0;
} else if (integer == 1) {
return 1;
} else {
return integer * factorial(integer-1);
}
}
不是最短的實現,但相當的可讀性。
您必須返回1
,通過0
乘以總是返回0
:
if(integer < 2)
{
return 1;
}
你的函數必須在基本情況下返回1
,像這樣:
if (integer <= 0) {
return 1;
}
你乘號和你知道任何數字乘以0
是零。你需要使用的是1
,乘法標識,因爲任何數字乘以1就是數字本身。
只需使用1而不是0.當您使用0時,您將有任何數字將乘以0,返回0.
例如:
5! 5.4.3.2.1 = = 120,而不是5.4.3.2.1.0 = 0
試圖執行一個簡單的測試情況下用鉛筆和紙:
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;
您允許的整數通過遞歸調用上浮爲零,返回零當它發現整爲零。所以你將你最後一次遞歸調用的結果乘以零。因此,你總是得到一個零作爲答案。
感謝您的所有答案,但我被告知,如果輸入0或負數,該方法必須返回0.是否沒有辦法執行該方法? – matt 2012-01-31 20:28:19
當然,只需添加另一個「if」:如果參數爲1,則返回1。 – theglauber 2012-01-31 20:31:06