
第一次写代码是这样的。但变量 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中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号