如何摆脱大量的函数调用?以下是递归函数的示例:
def factorial(n):
if n <= 1:
return 1
else:
return n * factorial(n - 1)
我听说你可以轻松地使用装饰器来做,但我不知道如何使用它们
答案 0 :(得分:4)
假设您已经仔细查看了算法并消除了任何冗余调用,您可以尝试以迭代方式重写函数(即使用循环而不是递归)。
递归通常可以以一种很好的方式表达问题的解决方案,但它更像是内存耗尽(反复在堆栈上保存状态)而不是由于所有函数调用而快速。我看到它的表现力的主要好处。
Memoization是另一种选择,因此,您不必重新计算(调用函数),而是先查看您之前是否已经计算(并存储)了一个值,而是使用它。 / p>
答案 1 :(得分:0)
您正在寻找tail call优化,这基本上是一种将递归程序转换为迭代而不重写它们的技术。例如,如果使用n = 1000调用阶乘函数,Python就会抱怨“超出最大递归深度”。但是,当您将函数重写为tail-recursive时:
def tail_factorial(n, result=1):
if n <= 1:
return result
else:
return fac(n - 1, result * n)
然后使用“蹦床”来调用它:
def trampoline_factorial(n):
def fac(n, result=1):
if n <= 1:
return result
else:
return lambda: fac(n - 1, result * n)
f = fac(n)
while callable(f):
f = f()
return f
你可以评价1000!没有任何问题。
尾部调用优化确实可以在Python中使用装饰器实现自动化,参见例如here