Golang 的递归内部函数 它应该丑吗?

问题描述

递归内部函数声明golang

它应该丑吗?

我目前正在尝试为 leetcode 问题编写递归 DFS(Golang 新手)

不运行:

当我尝试像这样创建和声明我的内部函数时:

outerFunction (node *TreeNode,target int) bool {
  checkSolutions := func(node *TreeNode,total int) bool {
        // ... DFS algo
        checkSolutions(node.Left)
        checkSolutions(node.Right)
    }
    
  return checkSolution(root,0)
}

我在递归调用期间无权访问内部函数并出现错误!但是,当我首先将该函数声明为变量时(如下),它会运行

运行:
outerFunction (node *TreeNode,target int) bool {
  var checkSolution func(*TreeNode,int) bool
  checkSolutions = func(node *TreeNode,0)
}

这是在 Go 中声明递归内部函数的最简洁的方法吗?出于某种原因,它对我来说感觉有点冗长,所以我只是想写这篇文章,看看是否有任何针对这种情况的 Golang 语法糖,但我遗漏了。

解决方法

总而言之,这是您能得到的最好的结果。没有比这里更好的了。

在 firat 情况下,您可以清楚地看到函数 checkSolutions 没有被清除。因此,当您在声明中使用它时,go 编译器不知道该函数是什么以及它应该做什么(参数和返回)。

outerFunction (node *TreeNode,target int) bool {
  checkSolutions := func(node *TreeNode,total int) bool {
        // ... DFS algo
        checkSolutions(node.Left)    // Is not decleared yet to be used
        checkSolutions(node.Right)
    }
    
  return checkSolution(root,0)
}

在其他情况下,当您定义了它应该做什么时,编译器可以理解这些定义并相应地进行。

,

我相信在snippet1 中,在赋值之前:= 右边的所有语句都必须被评估。一旦评估完成,就可以为其分配内存。

在代码段 1 中,我们在函数 checkSolution 存在之前调用它。因此它会抛出错误。

而在代码段 2 中,var checkSolution func(*TreeNode,int) bool 初始化并分配内存。所以它是存在的,可以被checkSolution

的内部函数调用

我相信这是实现这里递归的最佳方式。