可能的重复:
是递归永远快于循环?

我是第一个训练有素的程序的严重C,大约15年前。我雇主想要的高度优化的代码,用于计算上的困难任务。我记得正在建议中多次重写递归为循环,即使在昂贵的可读性,以避免"递归的开销。" 我的理解它,然后,递归的开销是额外的努力所需的数据推到一堆和后把它关闭。

现在我的代码中的C,蟒蛇,Perl,有时爪哇,我不知道有时候有关递归.还有什么可获得了通过改写他们吗?如果他们的尾巴递归?有现代化编制所有这些问题没有实际意义?是这样的关切无关解释语言?

有帮助吗?

解决方案

递归可导致显著开销如果递归函数的内核是更少的计算比函数入口/出口码以及电话本身的成本昂贵。找出最好的办法是简单地分析代码的两个版本 - 一个递归,和一个没有

这是说,如果你避免递归的想法是做一个类栈结构自己,注意 - 它不一定是任何比更简单的递归方法更快。再次,剖析是你的朋友。

最后,请记住,程序员时间比CPU时间更昂贵。你微优化你的代码之前,它确实是衡量,看它是否真的会是一个问题,一个好主意。

其他提示

有严重。大部分的语言我的代码有函数调用实际成本(对他们的编译器一般可以做尾递归以及所以有时它不是一个问题)。

这是成本,而事实上,堆栈没有无限的资源,通常使我倾向于使用递归只为我知道有一个在深度它可以去到了一个极限的情况。

例如,我知道一个平衡二叉树搜索将只内走完一百五十级深一个万亿条目。我不会,然而,使用:

def sum1through (n):
    if n == 0 return 0
    return n + sum1through (n-1)

因为这样做对两千万n不会是一个堆栈健康。

在问题仍然存在。递归需要大量的堆栈空间,因为每一个方法调用它本身的时候,它的指针和它的局部变量重新生成。的递归期间进行函数调用的数量使得为O(n)的内存使用情况;相比样环的非递归函数的O(1)。

我不认为任何你所提到的语言的需要的,该平台/编译器实现的尾调用消除。你可以找到的的需要这种优化语言 - 功能最全的语言都有这个要求

但是你要考虑的另一件事是,电脑已经成为数量级比15年前快,所以这是非常罕见现在然后,你需要大约微优化担心了。一种程序,15年前可能需要仔细汇编手工优化,以获得不俗的性能可能在现代计算机上运行速度极快,即使写在Java等高级语言。这并不是说,表现从来都不是一个问题的任何更多 - 但是你应该专注于选择的正确的算法的和写的读取的代码。仅使微优化已测出的性能后,可以看到有问题的代码是瓶颈。

有一件事情你的的需要担心的是,虽然溢出堆栈。如果有那发生它可能是值得重写以迭代方式递归函数,而不是任何风险。

人们说多愚蠢的事情,有关性能。

  1. 如果你 需要 递归,喜欢做深度第一棵树散步,然后你需要它,所以使用它。

  2. 以前担心的表现 任何东西, ,找出如果你有问题和它在哪里。
    性问题是喜欢骗子,骗子-他们专门从事正在那里你最不希望的,所以如果你在担心什么特定的样递归,你几乎能保证是令人担忧的有关错误的事情。

在我看来,最好的办法,以找到业绩问题是通过叠的取样 墙上的钟的时间, , 审查的样本,看看有什么程序做的, 不只是通过得到测量,并想知道他们是什么意思。

这就是说,如果你找到10%或更多的时间进入一个循环呼叫,并没有很多其他内发生的递归的惯例,你可以循环,然后循环它可能会帮助。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top