我第一次写这样的代码。但是变量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
}
这样修改代码后,left就有了right值。
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
在递归后应该有不同的值,但不是。
1条答案
按热度按时间cclgggtu1#
在第一种情况下,
left
变量位于内部lambda的闭包中。这意味着从函数的Angular 来看,这个变量是“全局的”。由于lambda是递归的,每次调用都会压碎前一个值,在(递归的)末尾,它的值是-1(递归的基本情况),并且在此之后(当从递归返回时)永远不会改变。在第二种情况下,
left
是一个局部变量,然后在每次调用时将其推入堆栈或从堆栈弹出。