递归聚合return 语句问题
Recursive aggregation return statements question
我正在研究一个问题,该问题计算给定二叉树上的所有分支总和以及 returns 数组或 python 列表中的结果,我知道这是正确的答案,但我我很难理解聚合过程是如何发生的,以及为什么如果在后续函数调用之前更新列表,那么为什么其他变量不更新。
代码:
def branchTot(root):
soln = []
fin = help(root, root.value, soln)
return fin
def help(root, sums, soln):
if root.left is None and root.right is None:
soln.append(sums)
else:
if root.right is not None and root.left is not None :
help(root.left, sums + root.left.value, soln)
help(root.right, sums + root.right.value, soln)
elif root.right is not None:
help(root.right, sums + root.right.value, soln)
else:
help(root.left, sums + root.left.value, soln)
return soln
例如树:
1
/ \
2 3
调用堆栈上的函数将是
(3.) 帮助(3,4,[3]) --> 返回:soln = [3,4]
(2.) help(2,3,[]) --> 返回:soln = [3]
(1.) 帮助(1,1,[])
我的问题是为什么在最后一个 (3.) 调用中如果 'soln' 变量是从上一个 (2.) 调用更新的那么为什么根和总和变量也不是从 (2 .) 而不是仍然来自 call(1.)?
比如为什么不是:
(因为 2.right 是 None)
(3.) 帮助(None,3+None,[3]) --> 返回:soln = [3,4]。
(2.) help(2,3,[]) --> 返回:soln = [3]
(1.) 帮助(1,1,[])
被 soln
引用的对象是可变的,可以(并且已经)就地改变。其他值是不可变的; sums + root.left.value
创建一个新对象以传递给下一次调用 help
,而 sums
和 root.left.value
在当前调用 help
时保持不变。
我正在研究一个问题,该问题计算给定二叉树上的所有分支总和以及 returns 数组或 python 列表中的结果,我知道这是正确的答案,但我我很难理解聚合过程是如何发生的,以及为什么如果在后续函数调用之前更新列表,那么为什么其他变量不更新。
代码:
def branchTot(root):
soln = []
fin = help(root, root.value, soln)
return fin
def help(root, sums, soln):
if root.left is None and root.right is None:
soln.append(sums)
else:
if root.right is not None and root.left is not None :
help(root.left, sums + root.left.value, soln)
help(root.right, sums + root.right.value, soln)
elif root.right is not None:
help(root.right, sums + root.right.value, soln)
else:
help(root.left, sums + root.left.value, soln)
return soln
例如树:
1
/ \
2 3
调用堆栈上的函数将是
(3.) 帮助(3,4,[3]) --> 返回:soln = [3,4]
(2.) help(2,3,[]) --> 返回:soln = [3]
(1.) 帮助(1,1,[])
我的问题是为什么在最后一个 (3.) 调用中如果 'soln' 变量是从上一个 (2.) 调用更新的那么为什么根和总和变量也不是从 (2 .) 而不是仍然来自 call(1.)?
比如为什么不是: (因为 2.right 是 None)
(3.) 帮助(None,3+None,[3]) --> 返回:soln = [3,4]。
(2.) help(2,3,[]) --> 返回:soln = [3]
(1.) 帮助(1,1,[])
被 soln
引用的对象是可变的,可以(并且已经)就地改变。其他值是不可变的; sums + root.left.value
创建一个新对象以传递给下一次调用 help
,而 sums
和 root.left.value
在当前调用 help
时保持不变。