簡體   English   中英

python中的嵌套遞歸函數

[英]Nested recursive function in python

我試圖在python中實現嵌套遞歸函數,它給出了錯誤“ RuntimeError:超出最大遞歸深度”,您可以在以下代碼中看到該函數。 感謝您對問題的幫助。

n=10

def test(n):
    if n<=0:
        return 1
    else:
        return test(test(n-1)+1)

print test(n)

遞歸的一個非常重要的部分是,每次遞歸調用都必須更接近錨點,在這種情況下,它是:

if n<=0:
    return 1

但是,使用您的代碼,您將無法接近這種情況。 問題是這一行:

return test(test(n-1)+1)

由於test到達末尾時返回1 ,並且您向該結果加1,因此讓我們看看調用test(2)會發生什么:

錨例沒有被執行,您直接進入else 你回來

test(test(1)+1)

因為2-1=1 您的內部測試調用也將轉到else案例並調用:

test(test(0)+1)

在這里,您的內部測試調用返回1(它已經達到了最終情況),這意味着您實際上在此行中調用

test(2) //test(1+1)

再次。 在這里,您可以看到遞歸永遠不會結束,因此maximum recursion depth exceeded error

只是為了闡明如何使此代碼(顯然只是示例)起作用:

def test(n):
    if n <= 0:
        return 1
    else:
        return test(test(n-1)-1)    //notice the -1 instead of +1

后續問題:

為什么將遞歸調用更改為test(test(n-2))也會導致無限遞歸?

嗯,這基本上是因為我一開始就指出了同樣的原因。 您需要靠近錨盒。 雖然您可以在嵌套遞歸調用test(n-2)達到n<=0的情況,但您肯定不能在外部函數調用中達到n<=0的情況。

請注意,您的函數在到達末尾時將返回1,因此,即使test(n-2)不再引起任何遞歸,它也會返回1(而不是0),這意味着您最終會獲得

test(1)

這將再次導致無限循環(因為對於此外部函數調用,您不能使n <= 0等於<= 0 )。

您有多種選擇可以使這種情況的遞歸工作:通過更改返回值或通過更改錨點大小寫。 因此,將if語句更改為以下任意一個將防止無限遞歸:

if n <= 0:
    return 0

要么

if n <= 1:
    return 1    //you could also return any other value <= 1

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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