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

Spe*_*her 13 recursion function 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)
}
Run Code Online (Sandbox Code Playgroud)

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

我怎么能在Go中这样做?

非常感谢

icz*_*cza 33

Function2如果它位于您声明它的行中,则无法访问它内部.原因是你不是指一个函数而是一个变量(它的类型是一个函数),它只能在声明之后才能访问.

引用规范:声明和范围:

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

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

Function2 := func(m int) int {
    if m <= a {
        return a
    }
    return Function2(m-1)
}
Run Code Online (Sandbox Code Playgroud)

并且正如语言规范所描述的引用形式一样,变量标识符Function2将仅在声明之后的范围内,因此您无法在声明本身内引用它.有关详细信息,请参阅了解Go中的变量范围.

首先声明Function2变量,因此您可以从函数文字中引用它:

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)
}
Run Code Online (Sandbox Code Playgroud)

Go Playground尝试一下.


Ton*_*nas 5

var Function2 func(m int) int
Function2 = func(m int) int {
    ...
Run Code Online (Sandbox Code Playgroud)

  • 一些解释会很好 (2认同)