登录
首页 >  Golang >  Go问答

树递归 - 如何避免“函数末尾缺少返回”?

来源:stackoverflow

时间:2024-03-17 10:09:30 219浏览 收藏

树递归是一种编程技术,但它在某些情况下可能导致编译器错误“函数末尾缺少返回”。为了解决这个问题,Go 语言提供了几种方法。 首先,可以执行 panic 操作,但这种方法不太理想。更好的方法是使用 if-else 或 switch 语句。if-else 语句允许在满足不同条件时返回不同的值,而 switch 语句则允许使用更简洁的语法。通过使用这些结构,可以确保函数在所有情况下都返回一个值,从而避免编译器错误。

问题内容

对于昆虫组合学的实验室问题,以下是我使用树递归的解决方案:

func Paths(m int, n int) int {
    length := m
    width := n

    var f func(int, int) int

    f = func(h int, v int) int {
        if h == width && v == length {
            return 1
        } else if h < width && v < length {
            return f(h, v+1) + f(h+1, v)
        } else if v < length {
            return f(h, v+1)
        } else if h < width {
            return f(h+1, v)
        } /*else { // this condition doesn't occur
            return 0
        }*/
    } // Line 19

    return f(1, 1)
}

上述解决方案不需要 else 块(无效),但编译器在第 19 行给出 missing 返回错误

上述代码如何避免 missing 返回错误


解决方案


go 不知道 // 这个条件不会发生 ,并且在分析代码时,它发现如果 if 语句的任何条件都不满足,则它缺少返回值。

“修复”此问题的一种方法是执行 panic(“不会发生”) 之类的操作。不过,我不喜欢这一点,因为多年来我遇到了太多的日志条目说“不会发生”...

或者,您可以使用 go 中可能更自然的方法:

if cond1 {
  return v1
}
if cond2 {
  return v2
}
//... other cases ... 
return v3

或者甚至是一个 switch 语句:

switch {
case cond1:
  return v1
case cond2:
  return v2
//... other cases ... 
default:
  return v3
}

您使用的“else if”是不必要的,因为每种情况都会导致函数立即返回。检查effective go 来了解这个模式。它也在标准库中广泛使用(即避免不必要的其他)。

另外,既然你说绝对不可能所有条件都为假,所以没有必要测试最后一个:这是“else”情况。

今天关于《树递归 - 如何避免“函数末尾缺少返回”?》的内容介绍就到此结束,如果有什么疑问或者建议,可以在golang学习网公众号下多多回复交流;文中若有不正之处,也希望回复留言以告知!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>