Go中的尾部调用优化
到目前为止,Go编程语言是否优化了尾部调用?如果没有,它是否至少优化了函数对自身的尾部递归调用?它没有。根据邮件列表上的核心开发团队的说法,也没有任何计划。您可以在互联网上找到的所有东西,“Go在某些情况下支持可裁剪的递归”,这些都在: 在某些情况下,它已经存在于6g/8g中,而在gccgo中则有所不同 更一般地说 我们目前不打算改变语言来要求这样做 编译器在所有情况下都实现尾部调用优化。如果必须的话 如果有尾部调用,则使用循环或goto语句Go中的尾部调用优化,go,tail-recursion,tail-call-optimization,Go,Tail Recursion,Tail Call Optimization,到目前为止,Go编程语言是否优化了尾部调用?如果没有,它是否至少优化了函数对自身的尾部递归调用?它没有。根据邮件列表上的核心开发团队的说法,也没有任何计划。您可以在互联网上找到的所有东西,“Go在某些情况下支持可裁剪的递归”,这些都在: 在某些情况下,它已经存在于6g/8g中,而在gccgo中则有所不同 更一般地说 我们目前不打算改变语言来要求这样做 编译器在所有情况下都实现尾部调用优化。如果必须的话 如果有尾部调用,则使用循环或goto语句 为了得到这些案例,你最好深入研究,这是公开的。扩展@
为了得到这些案例,你最好深入研究,这是公开的。扩展@Rostyslav的优秀答案。如果必须有尾部调用(在本例中为尾部递归调用),则可以执行类似的操作
package main
import "fmt"
func tail(i int) {
if i == 0 {
return
} else {
fmt.Println(i)
tail(i - 1) //tail recursive call
}
}
func main() {
tail(3) //3, 2, 1
}
如果我遵循,你可以通过编写一个尾部递归函数,然后编写它的迭代等价物并比较内存使用情况来测试它。因为关闭它会改变程序的运行能力。不,他们不会这样做。你不能用循环或GOTO替换所有尾部调用。@crmkааааафаааа:从技术上讲,你可以,但如果你必须将代码重写为一个函数中的所有部分,它会变得很难看。仍然是这样吗?