如何摆脱大量的函数调用?

时间:2012-08-24 13:06:29

标签: python recursion decorator

如何摆脱大量的函数调用?以下是递归函数的示例:

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

我听说你可以轻松地使用装饰器来做,但我不知道如何使用它们

2 个答案:

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