第一次寫程式碼是這樣的。但變數 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中文網其他相關文章!