【问题标题】:Question about recursive return statement order关于递归返回语句顺序的问题
【发布时间】:2019-12-18 06:20:09
【问题描述】:

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

 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

【问题讨论】:

  • 提示:要么只使用累加器而不返回任何东西,要么只使用返回值而不使用累加器。将两者混合只会使事情变得混乱。

标签: python recursion return-value recursive-backtracking


【解决方案1】:

如果一棵树只有一个节点(根节点),您的两种解决方案都可以使用。现在我们来谈谈第一种解决方案:

  • 只有在两个孩子都为 None 的情况下,您才返回 soln 数组。现在,如果节点有一个或多个孩子,这种情况总是会失败。因此,return 语句将永远不会执行。这就是原因,第一个解决方案是返回 None。这是使用二叉搜索树的执行。

    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
    

执行上面会给出以下输出:

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]: 

然而,在第二种解决方案中,您将 return 语句置于 if 块之外,因此无论如何都会执行 return 语句。这将返回最终的数组。

希望这会有所帮助。

【讨论】:

  • 我猜我为什么会感到困惑,因为它是基本情况,并且之前的递归调用正在向下移动,所以最终不会到达 return 语句?
  • 我很困惑为什么每次递归调用之后都会返回 None,是不是因为对方法的每次调用都必须有一个 return 语句,如果没有,那么它将返回 None。并且之前的 return 语句会被后续的 return 语句覆盖?
猜你喜欢
  • 2020-04-11
  • 1970-01-01
  • 2015-12-22
  • 2010-10-30
  • 2017-06-22
  • 2012-11-27
  • 2019-10-07
  • 2010-09-25
  • 2016-02-13
相关资源
最近更新 更多