[英]Factorial of a number using recursion
我具有以下遞歸函數來計算數字的階乘。 該程序運行正常,除非刪除了if條件。 有人可以解釋為什么嗎?
這是可以正常工作的代碼-
public static long factUsingRecursion(int number) {
if (number == 1) {
return 1;
} else {
return number * factUsingRecursion(number - 1);
}
}
如果沒有if條件(引發錯誤的代碼),
public static long factUsingRecursion(int number) {
return number * factUsingRecursion(number - 1);
}
我收到堆棧溢出錯誤。
birst.FactorialUsingRecursion.factUsingRecursion(FactorialUsingRecursion.java:10)
處的線程“主”中的異常java.lang.StackOverflowError
請專家請告訴我為什么會這樣?
在遞歸中,必須始終存在停止遞歸的基本情況。 沒有if
,您就沒有基本情況,也沒有停止它的情況。 最終,堆棧上的方法調用過多,並導致StackOverflowError
。
這行導致number
變量減少1
return number * factUsingRecursion(number - 1);
它將處理number
所有值,除非為1
所以這行代碼是一個中斷條件
if (number == 1) {
return 1;
}
它可以防止您避免stackoverflow異常
遞歸需要一個基本情況。 沒有它,它將繼續反復調用該函數,並且永不停止。 if語句是基本情況,它將終止遞歸。 這就是為什么如果刪除它,則會得到StackOverflowError
。
想象一下當您致電時會發生什么:
factUsingRecursion(3);
使用if:
3*factUsingRecursion(2)
3*2*factUsingRecursion(1)
3*2*1
沒有if:
3*factUsingRecursion(2)
3*2*factUsingRecursion(1)
3*2*1*factUsingRecursion(0)
3*2*1*0*factUsingRecursion(-1)
3*2*1*0*-1*factUsingRecursion(-2)
3*2*1*0*-1*-2*factUsingRecursion(-3)
...
And so on... It will not stop until you encounter the StackOverflow error
它失去了使遞歸函數具有遞歸的條件之一,因為它沒有退出條件。
所有遞歸解決方案必須滿足三個規則或屬性:遞歸解決方案必須包含一個基本案例。 遞歸解決方案必須包含一個遞歸案例。 遞歸解決方案必須在基本情況上取得進展。
來自:使用Python的數據結構和算法
當您刪除if條件時,該程序將不再工作,因為您將只剩下return number * factUsingRecursion(number - 1);
並且這里的factUsingRecursion(number - 1)
將具有相同的返回調用return number * factUsingRecursion(number - 1);
。 您的函數不斷地自我調用,永遠無法求值。 通過設置條件,您的函數可以在遞歸鏈中的某個點求值確定的值,並且可以調用第一個調用。
對於每個整數i,您使用i -1調用該函數。 Integersa是無限的,因此您永遠不會停止調用該函數。 例如:-1000將調用-1001,只要JVM在其堆棧中有一些空間,它就會繼續運行。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.