递归开销 - 有多严重?

Jos*_*ine 10 optimization recursion programming-languages tail-recursion interpreted-language

可能重复:
递归是否比循环更快?

大约15年前,我第一次接受C语言培训.我的雇主想要高度优化的代码来处理计算困难的任务.我记得不止一次被建议将递归重写为循环,即使是在昂贵的可读性方面,以避免"递归开销".正如我所理解的那样,递归开销是将数据推送到堆栈然后将其弹出所需的额外工作.

现在我用C,Python,Perl编写,有时用Java编写代码,我有时会想到递归.还有什么东西可以通过重写来获得吗?如果它们是尾递归怎么办?现代编译器让所有这些问题都没有实际意义吗?这些担忧是否与解释语言无关?

bdo*_*lan 17

如果递归函数的内核在计算上比函数入口/出口代码和调用本身的成本更低,则递归可能导致显着的开销.找出答案的最佳方法是简单地分析代码的两个版本 - 一个是递归的,一个不是.

也就是说,如果你想避免递归的想法是自己制作一个类似堆栈的结构,请注意 - 它可能不一定比更简单的递归方法更快.再次,分析是你的朋友.

最后,请记住,程序员时间比CPU时间更贵.在对代码进行微量优化之前,最好先测量一下它是否真的存在问题.