Python 关于递归返回语句顺序的问题

Python 关于递归返回语句顺序的问题,python,recursion,return-value,recursive-backtracking,Python,Recursion,Return Value,Recursive Backtracking,我一直在研究一个问题,这个问题计算二叉树上每个分支的和,并以数组的形式返回它们。这几乎是一个DFS问题,您将解决方案累积到一个数组中。我只是在努力理解在代码中把return语句放在哪里。我知道正确的答案,我只是不知道为什么下面这两个片段不相等: def branchTot(root): soln = [] fin = help(root, root.value, soln) return fin def help(root, sums, soln): i

我一直在研究一个问题,这个问题计算二叉树上每个分支的和,并以数组的形式返回它们。这几乎是一个DFS问题,您将解决方案累积到一个数组中。我只是在努力理解在代码中把return语句放在哪里。我知道正确的答案,我只是不知道为什么下面这两个片段不相等:

 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)
        return soln

    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)
第二种解决方案如下:

 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

如果有一个只有一个节点(根节点)的树,那么这两种解决方案都可以工作。现在让我们谈谈第一个解决方案:

  • 只有当两个子项都为None时,才返回soln数组。现在,如果节点有一个或多个子节点,该条件将始终失败。因此,return语句永远不会执行。这就是原因,第一个解决方案是不返回任何值。下面是使用二进制搜索树的执行

    class Tree:
        def __init__(self, val):
            self.value = val
            self.left = None
            self.right = None
    
        def add(self, val):
            if val <= self.value:
                if self.left is None:
                    self.left = Tree(val)
                else:
                    self.left.add(val)
            else:
                if self.right is None:
                    self.right = Tree(val)
                else:
                    self.right.add(val)
    
        def t_print(self):
            if self.left is not None:
                self.left.t_print()
            print self.value
            if self.right is not None:
                self.right.t_print()
    
    def help(root, sums, soln): 
       if root.left is None and root.right is None:
           soln.append(sums)
           print 'Returning value for node ' + str(root.value)
           return soln
    
       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)
        print 'Returning none for node ' + str(root.value)
        return None     # ----> This is what being executed after every recursive call finishes (for node with children)
    
    def branchTot(root):
        soln = []
        fin  = help(root, root.value, soln)
        return fin
    
    但是,在第二种解决方案中,您将return语句置于if块之外,因此,无论发生什么情况,都将执行return语句。这将返回最终数组


    希望这有帮助。

    提示:要么只使用累加器,不返回任何内容,要么只使用返回值,不使用累加器。混合两者只会使事情变得混乱。我想我之所以感到困惑是因为它最终不会到达return语句,因为它是基本情况,而之前的递归调用正在向下移动?我很困惑为什么每次递归调用之后都会返回None,这是因为对该方法的每个调用都必须有一个return语句,如果没有,则将不返回任何语句。以前的返回语句会被后续的返回语句覆盖吗?
    In [28]: root = Tree(9)
    In [29]: root.add(5)
    In [30]: root.add(3)
    In [31]: root.add(2)
    In [32]: root.add(10)
    In [33]: root.add(13)
    In [34]: root.add(11)
    
    
    In [26]: branchTot(root)
    Returning value for node 2
    Returning none for node 3     ----> node with children
    Returning none for node 5
    Returning value for node 11    ------> node without children
    Returning none for node 13
    Returning none for node 10
    Returning none for node 9
    
    In [27]: