在Go中的函数中定义递归函数

时间:2015-01-22 21:58:10

标签: function recursion go

我试图在Go中的另一个函数中定义一个递归函数,但我正在努力获得正确的语法。我正在寻找这样的东西:

func Function1(n) int {
   a := 10
   Function2 := func(m int) int {
      if m <= a {
         return a
      }
      return Function2(m-1)
   }

   return Function2(n)
}

我希望将Function2保留在Function1的范围内,因为它正在访问其范围的某些元素。

我怎样才能在Go中执行此操作?

非常感谢

2 个答案:

答案 0 :(得分:27)

如果它位于您声明的行中,则无法访问其中的Function2。原因是您不是指函数而是指变量(其类型是函数),并且只有在声明之后才能访问它。< / p>

引自Spec: Declarations and scope:

  

在函数内声明的常量或变量标识符的范围从ConstSpec或VarSpec的末尾开始(ShortVarDecl用于短变量声明),并在最内层包含块的末尾结束。

在您的示例中,Function2是变量声明,VarSpec是:

Function2 := func(m int) int {
    if m <= a {
        return a
    }
    return Function2(m-1)
}

正如语言规范所描述的引用形式,变量标识符Function2仅在声明后的范围内,因此您无法在声明本身内引用它。有关详细信息,请参阅Understanding variable scope in Go

首先声明Function2变量,以便您可以从function literal引用它:

func Function1(n int) int {
    a := 10
    var Function2 func(m int) int

    Function2 = func(m int) int {
        if m <= a {
            return a
        }
        return Function2(m - 1)
    }

    return Function2(n)
}

Go Playground上试用。

答案 1 :(得分:2)

var Function2 func(m int) int
Function2 = func(m int) int {
    ...