为什么我得到“超出最大递归深度”

时间:2016-04-01 11:50:21

标签: python if-statement recursion

我刚看到python的if-else语句的另一种结构,如(0, 1)[ x > 5],并希望通过递归尝试它,但由于某种原因它不起作用。只是忘记它是unpythonic。

这是一个原始代码,我试图用替代方法替换:

def f(n):
    return 1 if n == 1 else n * f(n - 1)

替代方案,它会产生递归问题:

def f(n):
    return (n * f(n - 1), 1)[n == 1]

替代代码有什么问题?

2 个答案:

答案 0 :(得分:5)

问题是Python在使用n * f(n - 1)索引元组之前总会尝试计算[n == 1]

结果是该函数一直调用自己,直到进程内存耗尽堆栈为止。

第一个代码通过在递归调用之前执行n==1检查来避免这种情况,然后在检查成功时不进行调用

来源:

https://docs.python.org/2/reference/expressions.html有一个关于评估顺序'的部分。声明它是从左到右执行的。

答案 1 :(得分:2)

您的第一个功能短路。如果n * f(n - 1),则n != 1计算

在第二个函数中,Python必须评估两个元素才能创建list,因此n * f(n - 1) 总是计算,即使从不访问元素也是如此。这导致无限递归。