众所周知,每个递归函数都可以在迭代版本中实现。
但是,递归函数通常在堆栈管理方面有一些开销。
考虑到这一点,我想知道是否存在一些通用原则,可以让我们决定何时递归版本比给定函数的迭代版本更好,假设两者都具有相同的时间复杂度。
答案 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)
,递归通过堆栈溢出而爆炸。