我试图在python中实现一个嵌套的递归函数,它给出了一个错误" RuntimeError:超出最大递归深度"您可以在以下代码中看到该功能。对此问题的帮助表示赞赏。
n=10
def test(n):
if n<=0:
return 1
else:
return test(test(n-1)+1)
print test(n)
答案 0 :(得分:6)
递归的一个非常重要的部分是,每次递归调用都必须使更接近到你的锚案例,在这种情况下是:
if n<=0:
return 1
但是,使用您的代码,您无法接近这种情况。问题是这一行:
return test(test(n-1)+1)
由于测试在到达最终案例时返回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))也会导致无限递归?
这基本上是因为我在开头指出的原因。你需要更接近你的锚案例。虽然您可以在嵌套递归调用n<=0
中找到test(n-2)
的大小写,但您无法在外部函数调用中访问它。
请注意,当函数到达最终大小写时,函数返回1,因此即使test(n-2)
不再导致递归,它也会返回1(而不是0),这意味着你最终得到了
test(1)
这又会导致一个无限循环(因为你不能为这个外部函数调用得到<= 0
)。
您可以使用多种方法使递归适用于此情况:通过更改返回值或更改锚案例。因此,将if语句更改为其中任何一个都将阻止无限递归:
if n <= 0:
return 0
或
if n <= 1:
return 1 //you could also return any other value <= 1