问题内容
第一次写代码是这样的。但变量 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
是一个局部变量,然后在每次调用时将其压入堆栈或从堆栈弹出。
以上就是您能解释一下为什么在函数内部声明变量时变量具有不同的值吗?的详细内容,更多请关注编程网其它相关文章!