我刚看到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]
替代代码有什么问题?
答案 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)
总是计算,即使从不访问元素也是如此。这导致无限递归。