递归函数与使用堆栈的内存使用方面的区别

时间:2011-02-28 16:55:09

标签: algorithm memory graph

我想知道递归函数和使用堆栈在内存使用方面的区别。 比较大的DFS,效率更高。

3 个答案:

答案 0 :(得分:5)

显式堆栈数据结构理论上应该使用稍微更少的内存,因为递归函数每次调用总会有一些额外的开销,返回地址等。

答案 1 :(得分:1)

我假设你想讨论同一算法的两种方法之间的区别。我们有一个图 G =(V,E)其中 V 是一组顶点,而 E 是一组顶点对,我们运行图上的深度优先搜索(DFS):

  • 使用递归方法,visit方法以递归方式调用自身。
  • 在循环中使用显式堆栈。

两种方法,大,使用相同数量的空间, O(d)其中 d 是DFS搜索树的深度(它受限于图中最长的非循环路径。

通常显式堆栈将使用稍微更少的内存,如Paul R所写。另一个重要的一点是,在许多语言中,函数调用堆栈受到严重限制,如果程序变得太大,将中止该程序。在堆中管理的显式堆栈不会产生类似的问题。为了减少稍微的内存使用量,您必须将堆栈表示为数组。如果您将其表示为链接列表,则可能不会更好。它可能会稍微恶化。

答案 2 :(得分:1)

我会走另一条路,至少在编译语言方面。为了高效而编写的递归函数可以比显式堆栈做得更好。编译器可以使用拥有它们的CPU的堆栈帧操作原语来更有效地执行操作。

James S Miller和Guillermo Rosaz撰写的“垃圾收集速度快但堆栈更快”支持此视图:http://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.18.2789