可以通过编译器优化延迟的递归调用吗?

问题描述 投票:3回答:2

假设我有这个功能:

func abc(i int) (e error) {
    defer func() {
        if r := recover(); r != nil {
            abc(i * 2)
        }
    }()

    if someCondition(i) {
      return fmt.Errorf("Some Err");
    }

    return action() // returns err (nil in case of success) or panics
}

这会被视为尾递归调用吗?它可以由编译器优化,因为可以优化尾递归调用吗?

我知道以这种方式抑制恐慌不是一个好的决定,但假设有一个正确的condition()函数,这是安全的,并正确地确定何时退出。

go tail-recursion
2个回答
5
投票

这里有两件事要说:

  • recover()将价值传递给panic。在你的情况下,除非someCondition恐慌,recover将永远返回零。所以我不确定你要做什么。
  • Go不进行尾调用优化,go团队更喜欢有意义的堆栈跟踪。有关于它的讨论但尚未达成一致意见。

如果你要做的是将i * 2乘以条件为真,那么就这样做:

// using recursion
func abc(i int) error {
    if err := someCondition(i); err != nil {
      return abc(i * 2);
    }
    return nil
}

// using loop
func abc(i int) error {
    for someCondition(i) != nil {
        i *= 2
    }
    return nil
}

2
投票

这会被视为尾递归调用吗?

没有。

可以通过编译器优化尾递归调用吗?

没有。

不要那样做。这种聪明才智。

© www.soinside.com 2019 - 2024. All rights reserved.