什么时候递归函数比其迭代版本好?

时间:2019-06-21 04:00:09

标签: function recursion

众所周知,每个递归函数都可以在迭代版本中实现。

但是,递归函数通常在堆栈管理方面有一些开销。

考虑到这一点,我想知道是否存在一些通用原则,可以让我们决定何时递归版本比给定函数的迭代版本更好,假设两者都具有相同的时间复杂度。

1 个答案:

答案 0 :(得分:0)

尽管与调用同一函数的循环相比,递归函数可能会有一些额外的开销,但除此之外,两种方法之间的差异相对较小。

在迭代方法上选择递归的主要驱动因素是所解决问题的复杂性(即运行时间)。斐波那契数列是迭代在很大程度上胜过递归的典型示例。

使用递归计算第五个斐波那契数需要计算:

f(5) = f(4) + f(3)
   f(4) = f(3) + f(2)
        f(3) = f(2) + f(1)
   f(3) = f(2) + f(1)

上面的代码需要四个递归调用和大约10个函数求值。另一方面,如果我们改为使用动态编程并迭代建立Fibonacci,则只需要两个函数调用(f(1)f(2)都是1的常数) :

f(3) = f(2) + f(1) (first call)
f(4) = f(3) + f(2) (second call)

当计算较大的斐波那契序列值时,使用迭代的优势变得更加明显。 f(100),递归通过堆栈溢出而爆炸。