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