让我们说我有一个递归函数,在它到达基本情况之前多次调用它自己(比如阶乘)/得到一个值来开始展开其余的链。编译器是否会将其优化为相同的代码,就像我要以迭代格式编写该函数一样?
答案 0 :(得分:1)
答案是“也许”。但是如果你真的想要确保编译器不会使函数实际上是递归的,那么你必须迭代地编写它。
许多编译器可以检测到“尾递归”并将其转换为循环。但并非总是如此,并且并不总是具有与您自己将其作为迭代函数编写的效率相同的效率。
对于更复杂的情况,例如Fibonacci系列(这不是一个简单的尾递归函数),编译器通常很难真正意识到正在发生的事情,并且它必须求助于实际上使其递归,甚至是“让它迭代是非常微不足道的。 [当我在递归方法中尝试使用fibonacci时,我的结果比迭代方法更糟糕 - 表明编译器没有解决它 - 并且使用gcc
通常在这些事情上相当聪明]。
答案 1 :(得分:0)
也许,但要注意C ++的语义经常使它变得更加困难。那些在你返回时被调用的析构函数意味着很多看起来像尾递归的东西不是。