Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/go/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Go中的尾部调用优化_Go_Tail Recursion_Tail Call Optimization - Fatal编程技术网

Go中的尾部调用优化

Go中的尾部调用优化,go,tail-recursion,tail-call-optimization,Go,Tail Recursion,Tail Call Optimization,到目前为止,Go编程语言是否优化了尾部调用?如果没有,它是否至少优化了函数对自身的尾部递归调用?它没有。根据邮件列表上的核心开发团队的说法,也没有任何计划。您可以在互联网上找到的所有东西,“Go在某些情况下支持可裁剪的递归”,这些都在: 在某些情况下,它已经存在于6g/8g中,而在gccgo中则有所不同 更一般地说 我们目前不打算改变语言来要求这样做 编译器在所有情况下都实现尾部调用优化。如果必须的话 如果有尾部调用,则使用循环或goto语句 为了得到这些案例,你最好深入研究,这是公开的。扩展@

到目前为止,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ааааафаааа:从技术上讲,你可以,但如果你必须将代码重写为一个函数中的所有部分,它会变得很难看。仍然是这样吗?