python中

时间:2016-05-28 15:00:36

标签: python python-3.x recursion

我试图在python中实现一个嵌套的递归函数,它给出了一个错误" RuntimeError:超出最大递归深度"您可以在以下代码中看到该功能。对此问题的帮助表示赞赏。

n=10

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

print test(n)

1 个答案:

答案 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