问题描述
递归内部函数声明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
我相信这是实现这里递归的最佳方式。