在递归中分配局部变量

时间:2013-02-04 23:21:19

标签: python recursion

我有一棵树而且它不是二叉树,所以我想比较所有节点并使用递归返回最大的节点。我有一个如何跟踪它的问题,因为我不能放一个全局变量,因为它必须是本地的...我猜...但是如果递归,它会重置局部变量。 / p>

def tree_max(node):
    max=1                                                                                     
    if node.left == None and node.right == None:
       if node.value>max:
          max=node.value
          return max
    elif node.left == None and node.right != None:
        return tree_max(node)
    elif node.left != None and node.right == None:
        return tree_max(node.left)
    else:
        return tree_max(node.left)

有什么建议吗?

3 个答案:

答案 0 :(得分:4)

您不需要在所有递归调用中保持变量的最大值,并且无论如何都不需要全局调用。在结构良好的递归中,结果将在每个递归调用的返回值中传递。像这样:

def tree_max(node):
    maxleft  = float('-inf') if not node.left  else tree_max(node.left)
    maxright = float('-inf') if not node.right else tree_max(node.right)
    return max(node.value, maxleft, maxright)

以上假设node不是None,如果node可以为null,则在调用tree_max()之前检查此条件。< / p>

答案 1 :(得分:3)

我有一个遍历树的生成器。这意味着您可以编写min()sum()等,而无需复制遍历逻辑

def tree_traverse(node):
    if not node.left and not node.right: # if only leaf nodes have values
        yield node.value
    if node.left:
        for v in tree_traverse(node.left):
            yield v
    if node.right:
        for v in tree_traverse(node.right):
            yield v

现在您可以使用max(tree_traverse(node))

如果所有节点都有值,您可以跳过第一个if并继承yield

正如@abarnert所说,Python3.3有一种简化递归生成器的好方法

def tree_traverse(node):
    if not node.left and not node.right: # if only leaf nodes have values
        yield node.value
    if node.left:
        yield from tree_traverse(node.left)
    if node.right:
        yield from tree_traverse(node.right)

答案 2 :(得分:1)

这通常使用关键字参数来完成,例如

def tree_max(node, max=None):