Go语言 你能解释一下为什么在函数内部声明变量时变量有不同的值吗?

cqoc49vn  于 2023-06-27  发布在  Go
关注(0)|答案(1)|浏览(161)

我第一次写这样的代码。但是变量left总是具有值-1

func diameterOfBinaryTree(root *TreeNode) int {
    var longest int
    var left int
    var right int
    max := func(a, b int) int {
        if a > b {
            return a
        }
        return b
    }
    var dfs func(*TreeNode) int
    dfs = func(node *TreeNode) int {
        if node == nil {
            return -1
        }
        left = dfs(node.Left)
        right = dfs(node.Right)

        longest = max(longest, left+right+2)
        return (max(left, right) + 1)
    }
    dfs(root)
    return longest
}

这样修改代码后,left就有了right值。

func diameterOfBinaryTree(root *TreeNode) int {
    var longest int
    max := func(a, b int) int {
        if a > b {
            return a
        }
        return b
    }
    var dfs func(*TreeNode) int
    dfs = func(node *TreeNode) int {
        if node == nil {
            return -1
        }
        left := dfs(node.Left)
        right := dfs(node.Right)

        longest = max(longest, left+right+2)
        return (max(left, right) + 1)
    }
    dfs(root)
    return longest
}

有什么区别?请告诉我。
我认为变量left在递归后应该有不同的值,但不是。

cclgggtu

cclgggtu1#

在第一种情况下,left变量位于内部lambda的闭包中。这意味着从函数的Angular 来看,这个变量是“全局的”。由于lambda是递归的,每次调用都会压碎前一个值,在(递归的)末尾,它的值是-1(递归的基本情况),并且在此之后(当从递归返回时)永远不会改变。
在第二种情况下,left是一个局部变量,然后在每次调用时将其推入堆栈或从堆栈弹出。

相关问题