【问题标题】:Tail Call Optimization in GoGo 中的尾调用优化
【发布时间】:2012-08-19 14:54:10
【问题描述】:

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

【问题讨论】:

标签: go tail-recursion tail-call-optimization


【解决方案1】:

您可以在 Internet 上找到的所有内容,即“Go 在某些情况下支持可尾递归”,这在 mailing list 中被告知:

在某些情况下它已经存在于 6g/8g 中,并且在 gccgo 中有些 更普遍。

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

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

【讨论】:

  • 您不能用循环或 goto 替换所有尾调用。
  • @райтфолд:从技术上讲你可以,但如果你必须重写代码以实现一个功能,那就太难看了。
【解决方案2】:

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

【讨论】:

  • 还是这样吗?
【解决方案3】:

扩展@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
}

【讨论】:

    猜你喜欢
    • 2011-05-27
    • 2019-04-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-31
    • 2014-04-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多