登录
首页 >  Golang >  Go问答

为什么在函数中声明的变量具有不同的值?

来源:stackoverflow

时间:2024-02-08 23:36:22 222浏览 收藏

最近发现不少小伙伴都对Golang很感兴趣,所以今天继续给大家介绍Golang相关的知识,本文《为什么在函数中声明的变量具有不同的值?》主要内容涉及到等等知识点,希望能帮到你!当然如果阅读本文时存在不同想法,可以在评论中表达,但是请勿使用过激的措辞~

问题内容

第一次写代码是这样的。但变量 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 是一个局部变量,然后在每次调用时将其压入堆栈或从堆栈弹出。

今天关于《为什么在函数中声明的变量具有不同的值?》的内容就介绍到这里了,是不是学起来一目了然!想要了解更多关于的内容请关注golang学习网公众号!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>