首頁 > 後端開發 > Golang > 您能解釋為什麼在函數內部宣告變數時變數具有不同的值嗎?

您能解釋為什麼在函數內部宣告變數時變數具有不同的值嗎?

王林
發布: 2024-02-12 17:30:06
轉載
411 人瀏覽過

您能解釋為什麼在函數內部宣告變數時變數具有不同的值嗎?

問題內容

第一次寫程式碼是這樣的。但變數 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 是一個局部變量,然後在每次呼叫時將其壓入堆疊或從堆疊彈出。

以上是您能解釋為什麼在函數內部宣告變數時變數具有不同的值嗎?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:stackoverflow.com
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板