如何正确使用Python中的递归和副作用

2024-06-01 01:06:19 发布

您现在位置:Python中文网/ 问答频道 /正文

在一棵树的结构中,我试图找到一根树枝的所有叶子。以下是我写的:

def leafs_of_branch(node,heads=[]):
    if len(node.children()) == 0:
        heads.append(str(node))
    else:    
        for des in node.children():
           leafs_of_branch(des)
    return heads


leafs_of_branch(node)

我不知道为什么,但我觉得不对。它可以工作,但是我想知道是否有更好的方法来使用递归而不创建heads参数。在


Tags: ofbranchnodelenifdef结构else
3条回答

只要递归继续,在我看来,你做得对;你在递归调用tho上缺少heads参数。不管怎么说,它仍然有效的原因是,正如其他人所说,默认参数是全局的,并且在调用之间重用。在

如果要避免递归altogheter,在这种情况下,可以使用队列或堆栈和循环:

def leafs_of_branch(node):
    traverse = [node]
    leafs = []

    while traverse:
        node = traverse.pop()
        children = node.children()

        if children:
            traverse.extend(children)
        else:
            leafs.append(str(node))

    return leafs

我认为这应该有效:

def leafs_of_branch(node):
    if len(node.children()) == 0:
       return [str(node)]
    else:
       x = []
       for des in node.children():
           x += leafs_of_branch(des)  #x.extend(leafs_of_branch(des)) would work too :-)
       return x

它不是很漂亮,也许可以再压缩一点,但我尽量保持原始代码的形式,以使发生的事情变得显而易见。在

如果您多次调用原始版本,它实际上将无法工作,因为当您附加到heads列表时,该列表实际上会在调用之间保存。在

这个

def leafs_of_branch(node,heads=[]):

总是个坏主意。最好是这样

^{pr2}$

除此之外,您始终使用相同的列表来表示分支的叶数。在你的具体情况下,也许没问题,但迟早你会遇到问题的。在

我建议:

def leafs_of_branch(node):
    leafs = []
    for des in node.children():
        leafs.extend(leafs_of_branch(des))
    if len(leafs)==0:
        leafs.append(str(node))
    return leafs

leafs_of_branch(node)

我没有执行if len(node.children()==0,而是在降到所有(可能是零)子级之后检查len(leafs)。所以我打电话来节点.子项()只有一次。在

相关问题 更多 >