首页 > 文章列表 > 函数内部声明的变量为什么会具有不同的值?

函数内部声明的变量为什么会具有不同的值?

207 2024-02-20
问题内容

第一次写代码是这样的。但变量 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
}

像这样更改代码后,左边有右边的值。

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 在递归后应该具有不同的值,但事实并非如此。


正确答案


在第一种情况下,left 变量位于内部 lambda 的闭包中。这意味着从函数的角度来看该变量是“全局”的。由于 lambda 是递归的,因此每次调用都会破坏先前的值,在(递归)结束时,其值为 -1(递归基本情况),并且此后(从递归返回时)从未更改。

在第二种情况下,left 是一个局部变量,然后在每次调用时将其压入堆栈或从堆栈弹出。