首页 >后端开发 >Golang >您能解释一下为什么在函数内部声明变量时变量具有不同的值吗?

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

王林
王林转载
2024-02-12 17:30:06403浏览

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

问题内容

第一次写代码是这样的。但变量 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 在递归后应该具有不同的值,但事实并非如此。

解决方法left

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

以上是您能解释一下为什么在函数内部声明变量时变量具有不同的值吗?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文转载于:stackoverflow.com。如有侵权,请联系admin@php.cn删除