【问题标题】:Recursive Inner Functions Golang递归内部函数 Golang
【发布时间】:2021-07-22 00:45:07
【问题描述】:

递归内部函数声明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, total int) bool {
        // ... DFS algo
        checkSolutions(node.Left)
        checkSolutions(node.Right)
    }
    
  return checkSolution(root, 0)
}

这是在 Go 中声明递归内部函数的最简洁方式吗?出于某种原因,这对我来说有点冗长,所以我只是想发表这篇文章,看看是否有任何适用于这种情况的 Golang 语法糖,但我错过了。

【问题讨论】:

    标签: go recursion depth-first-search


    【解决方案1】:

    总的来说,这是你能得到的最好的。这里没有比这更好的了。

    在 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)
    }
    

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

    【讨论】:

      【解决方案2】:

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

      在 sn-p1 中,我们在函数 checkSolution 存在之前调用它。因此它会引发错误。

      而在 sn-p2 var checkSolution func(*TreeNode, int) bool 中初始化并分配内存。所以它是存在的,可以被checkSolution的内部函数调用

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

      【讨论】:

        猜你喜欢
        • 2021-07-19
        • 2012-10-08
        • 2015-05-09
        • 1970-01-01
        • 2021-10-21
        • 2020-09-05
        • 1970-01-01
        • 1970-01-01
        • 2013-12-07
        相关资源
        最近更新 更多