有什么时候我想在递归时使用显式堆栈吗?

时间:2009-10-15 08:45:33

标签: language-agnostic recursion stack

在我的算法中是否有任何需要使用显式堆栈数据结构的情况,而不是进行递归(使用调用堆栈)?

以一种方式做另一种方式有什么好处吗?我认为使用显式数据结构会更高效,因为它不需要方法调用,但再次是微优化领域。

5 个答案:

答案 0 :(得分:5)

我可以想到一个案例,你可以争论一个明确的堆栈:

您可能处于进入和/或退出堆栈帧的系统很昂贵,并且您的递归深度非常深。想象一下树中的深度优先。

在这样的设置中,如果您发现请求的树节点100级别深,那么如果您正在使用递归,则需要逐个销毁100个堆栈帧。

使用显式堆栈,您可以从函数返回,并立即释放完整的堆栈。

答案 1 :(得分:4)

使用显式结构可以交换更简单的代码以获得更高的性能。

使用堆栈进行递归通常可以实现非常优雅和简短的代码。

使用显式堆栈通常会使代码(更多)变得更复杂,但您可以保存在以下几个位置:

  • 您无需为函数/方法调用付费(对脚本/动态语言非常有用)
  • 您只能保存所需的位数。如果使用递归,则必须保存整个堆栈帧(包含所有局部变量,返回地址,所有参数)。
  • 您可以在显式堆栈中查看(即您可以看到发生了什么“之前的两次递归”),这对于正常堆栈来说有点困难
  • 虽然可以出于多种原因限制实际堆栈,但您可以为隐式堆栈分配尽可能多的内存(甚至使用数据库)。

答案 2 :(得分:3)

根据您的运行时而不是内存中的结构,调用堆栈更受限制。 很多时候,由于.NET中的StackOverflowExceptions,我不得不进行堆栈数据结构的递归。

答案 3 :(得分:2)

递归调用堆栈通常是有限的,而显式堆栈对于大多数实际用途是无限的。因此,如果您希望具有非常深的递归级别(根据您的平台而有所不同),则最好为显式堆栈重新设计算法。例如。图形或树上的许多算法有两种形式:由于这个原因,使用递归和显式堆栈。

答案 4 :(得分:0)

显式堆栈还可以为您提供更好的参照局部性,从而提高缓存效率。在您的真实数据之间在堆栈中存储函数地址的多个副本是缓存压缩。