是否依赖于尾调用(包括尾递归)编译器/实现?

Is tail call (including tail recursion) compiler/implementation dependent?

提问人:duong_dajgja 提问时间:4/24/2023 更新时间:4/24/2023 访问量:57

问:

在互联网上搜索时,我偶然发现了编译器如何知道递归是否是尾递归,以及它如何优化尾递归。如果我理解正确的话,那么尾递归比非尾递归快的原因是编译器不会为新函数调用创建堆栈帧。那么它依赖于编译器,对吧?是否始终保证在所有语言的所有编译器上?另外,如果它依赖于编译器,那么为什么很多人一直称它为“算法”?tail recursion

算法 语言-不可知 尾递归 尾调用优化

评论

0赞 Chris Dodd 4/24/2023
在某些语言(例如 scheme)中,编译器需要将尾递归消除作为语言规范的一部分。在其他情况下,它只是一个可选的优化。尾递归“算法”是一种适合(并通过此优化进行改进)的算法。

答:

0赞 DannyNiu 4/24/2023 #1

是的,尾部调用(递归或非递归)优化取决于实现。不,如果编译器还不够智能,它将无法检测到至少一些尾部调用。