返回

从理论到实践,轻松掌握递归转非递归的通用套路

闲谈

递归与非递归

在开始之前,我们先来了解一下递归和非递归的概念。

  • 递归:递归是指函数调用自身。在递归函数中,函数会不断地调用自身,直到满足某个条件时才停止。
  • 非递归:非递归是指函数不调用自身。在非递归函数中,函数会通过循环或其他方式来实现同样的功能。

从递归到非递归的通用套路

现在,我们来看看如何把递归函数改为非递归函数。以下是一般性步骤,可以通用于大多数情况:

  1. 创建一个栈来存储函数调用信息。
  2. 将递归函数的第一个调用压入栈中。
  3. 循环执行以下步骤,直到栈为空:
    • 将栈顶的调用信息弹出。
    • 根据调用信息,执行相应的操作。
    • 如果该调用需要进一步递归,则将该调用的信息压入栈中。
  4. 当栈为空时,递归函数执行结束。

实例演示

为了更好地理解通用套路,我们来看一个实例。我们假设有一个递归函数factorial,用于计算一个非负整数的阶乘。

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

现在,我们将把这个递归函数改为非递归函数。

def factorial_non_recursive(n):
    stack = []
    stack.append((n, 1))
    while stack:
        n, result = stack.pop()
        if n == 0:
            return result
        else:
            stack.append((n-1, result*n))

factorial_non_recursive函数中,我们首先创建了一个栈来存储函数调用信息。然后,我们将递归函数的第一个调用压入栈中。接下来,我们循环执行以下步骤,直到栈为空:

  • 将栈顶的调用信息弹出。
  • 根据调用信息,执行相应的操作。
  • 如果该调用需要进一步递归,则将该调用的信息压入栈中。

当栈为空时,递归函数执行结束。

总结

通过上面的例子,我们已经掌握了一种把递归函数改为非递归函数的通用套路。这种通用套路可以通用于大多数情况。在实际应用中,我们可以根据具体情况对通用套路进行调整,以达到最佳的性能。

拓展阅读