递归聚合返回语句问题

时间:2019-12-18 22:59:40

标签: python python-3.x recursion return return-value

我正在研究一个问题,该问题将计算给定二叉树上的所有分支总和,并将结果返回到数组或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。)help(3,4,[3])->返回:soln = [3,4]

(2。)help(2,3,[])->返回:soln = [3]

(1。)help(1,1,[])

我的问题是,为什么在last(3。)调用中,如果从上一个(2.)调用中更新了'soln'变量,那么为什么也没有从(2.)而不是root和sum变量中更新仍无法通话(1.)?

像为什么不这样: (因为2.right为None)

(3。)help(None,3 + None,[3])->返回:soln = [3,4]。

(2。)help(2,3,[])->返回:soln = [3]

(1。)help(1,1,[])

1 个答案:

答案 0 :(得分:0)

soln引用的对象 是可变的,可以就地进行(并且已经进行了突变)。其他值是不可变的。 sums + root.left.value创建一个新对象,以传递给对help的下一次调用,而在当前对sums的调用中,root.left.valuehelp都保持不变。