迭代与递归效率

时间:2015-05-07 17:18:31

标签: performance recursion stack cpu

我对递归的工作方式有一个基本的了解 - 但我总是迭代编程。

当我们查看关键字CPU / stack / calls和space时,递归与迭代的不同之处是什么?

由于运行了许多堆栈(?)和#34;它需要更多内存。每个(最有可能)存储一个值。因此,它比相同问题的迭代解决方案占用更多空间。一般来说这是。在某些情况下,递归会更好,例如编程河内塔等。

我错了吗?我很快就参加了考试,我必须准备很多科目。递归不是我的强项,所以我会很感激这方面的一些帮助:)

1 个答案:

答案 0 :(得分:1)

这实际上取决于语言和编译器/解释器的性质。

某些函数语言实现尾递归,例如,用于识别在递归到下一个调用之前可以销毁/释放堆栈帧的特定情况。在那些支持它的语言/编译器/解释器中的特殊情况下,实际上可以有无限递归而不会溢出堆栈。

如果您正在使用使用硬件堆栈并且不实现尾递归的语言,那么通常您必须在分支到函数之前将参数推送到堆栈并将其与返回一起弹出值,所以在那里有一些隐含的数据结构(如果我们可以称之为)。此处还可能发生各种其他事情,例如注册阴影以优化它。

硬件堆栈通常非常高效,通常只是递增和递减堆栈指针寄存器以进行推送和弹出,但它确实涉及比使用循环计数器或条件分支更多的状态和指令。也许更重要的是,它倾向于涉及更远的分支跳转到另一个函数的代码,而不是在同一代码体内循环,这可能涉及更多的指令缓存和页面未命中。

在使用硬件堆栈的这些类型的语言/编译器/解释器中,并且总是会以足够的递归溢出它,循环路由通常会提供性能优势(但编码可能会更加繁琐)。

作为一种扭曲,你还有一些积极的优化器,它们会在将代码翻译成机器指令并将其链接起来,如内联函数和展开循环,以及将所有这些因素考虑在内时,对代码进行各种魔术处理。 ,通常更好地对事物进行更自然的编码,然后使用剖析器进行测量,如果它可以使用一些调整。当然,在可能溢出的情况下你不应该使用递归,但我通常不会担心大部分时间的开销。