首页 > 后端开发 > Golang > 正文

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

王林
发布: 2024-02-12 17:30:06
转载
352 人浏览过

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

问题内容

第一次写代码是这样的。但变量 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
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责声明 Sitemap
PHP中文网:公益在线PHP培训,帮助PHP学习者快速成长!