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

Via*_*iuk 4 python recursion if-statement

我只是看到python的if-else语句的替代构造,(0, 1)[ x > 5]并希望尝试递归,但由于某种原因,它不起作用.只是忘了它是unpythonic的片刻.

这是一个原始代码,我试图替换为替代:

def f(n):
    return 1 if n == 1 else n * f(n - 1)
Run Code Online (Sandbox Code Playgroud)

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

def f(n):
    return (n * f(n - 1), 1)[n == 1]
Run Code Online (Sandbox Code Playgroud)

替代代码有什么问题?

Tom*_*ees 5

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

结果是该函数不断调用自身,直到进程在堆栈上耗尽内存.

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

资源:

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