英文:
Could you explain why variable has different value when declare variable inside of function?
问题
第一次写的代码中,变量left
始终具有值-1
。
第二次修改后的代码中,left
有正确的值。
两者的区别是在第一次写的代码中,left
是一个全局变量,而在第二次修改后的代码中,left
是在每次递归调用时重新声明的局部变量。
在第一次写的代码中,left
的值在每次递归调用时都会被覆盖为新的值,因此最终只会保留最后一次递归调用的结果。而在第二次修改后的代码中,每次递归调用都会创建一个新的局部变量left
,因此每个递归调用都会有自己的left
值,不会相互干扰。
所以,第二次修改后的代码中的left
变量会有不同的值,而第一次写的代码中的left
变量始终为-1
。
英文:
At the first time, I write code like this. but variable left
always has value -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
}
and after change code like this, left has right value.
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
}
what is difference ?? please let me know.
I think variable left
should have different value after recursion but not.
答案1
得分: 1
在第一种情况下,left
变量位于内部lambda函数的闭包中。这意味着从函数的角度来看,这个变量是“全局”的。由于lambda函数是递归的,每次调用都会覆盖先前的值,在递归的末尾(递归基本情况)其值为-1,并且在递归返回时不会再改变。
在第二种情况下,left
是一个局部变量,每次调用时都会被推入/弹出堆栈。
英文:
In the first case, the left
variable is in the closure of the inner lambda. That means that this variable is "global" from the point of view of the function. As the lambda is recursive, each call crushes the previous value, at the end (of the recursion) its value is -1 (the recursion base case) and never changed after (when going back from the recursion).
In the second case, left
is a local variable and then pushed/popped to/from the stack at each call.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论