簡體   English   中英

使用遞歸的階乘

[英]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.

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