42

到目前为止,Go 编程语言是否优化了尾调用?如果不是,它是否至少优化了函数对自身的尾递归调用?

4

3 回答 3

18

您可以在 Internet 上找到的所有内容,即“Go 在某些情况下支持可尾递归”,并且在邮件列表中被告知:

在某些情况下,它已经存在于 6g/8g 中,而在 gccgo 中则更为普遍。

我们目前不打算更改语言以要求编译器在所有情况下都实现尾调用优化。如果必须有尾调用,则使用循环或 goto 语句。

要获得这些案例,您最好深入研究 golang source,它是开放的。

于 2012-08-24T21:05:24.990 回答
3

它不是。根据邮件列表中的核心开发团队也没有任何计划。

于 2012-08-24T06:19:02.690 回答
2

扩展@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
}
于 2020-09-06T08:13:15.743 回答