Python 关于递归返回语句顺序的问题
我一直在研究一个问题,这个问题计算二叉树上每个分支的和,并以数组的形式返回它们。这几乎是一个DFS问题,您将解决方案累积到一个数组中。我只是在努力理解在代码中把return语句放在哪里。我知道正确的答案,我只是不知道为什么下面这两个片段不相等: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
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语句永远不会执行。这就是原因,第一个解决方案是不返回任何值。下面是使用二进制搜索树的执行
但是,在第二种解决方案中,您将return语句置于if块之外,因此,无论发生什么情况,都将执行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语句,因为它是基本情况,而之前的递归调用正在向下移动?我很困惑为什么每次递归调用之后都会返回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]: