假设我有一个递归函数,它在到达基本情况之前多次调用自身(如阶乘)/获得一个值以开始展开其余的链。编译器会将其优化为与我以迭代格式编写该函数一样的代码吗?
问问题
94 次
2 回答
1
这个问题的答案是“也许”。但是如果你真的想确保编译器不会使函数真正递归,那么你必须迭代地编写它。
许多编译器可以检测“尾递归”并将其转换为循环。但并非总是如此,而且并不总是像您自己将其编写为迭代函数那样具有相同的效率。
对于更复杂的情况,例如斐波那契数列(这不是一个简单的尾递归函数),编译器通常很难真正意识到发生了什么,它必须求助于实际使其递归,即使它是使其迭代非常简单。[当我在递归方法中尝试斐波那契时,我的结果比迭代方法差得多 - 表明编译器没有解决它 - 而使用gcc
它通常在这些事情上相当聪明]。
于 2013-04-12T16:09:38.663 回答
0
也许吧,但请注意,C++ 的语义通常会使它变得更加困难。返回时调用的那些析构函数意味着很多看起来像尾递归的东西不是。
于 2013-04-12T16:09:37.273 回答