Python(yield):树中从叶到根的所有路径

时间:2011-08-20 21:16:49

标签: python yield

我想生成树中每个叶子到根的所有路径。我想用发电机来做,以节省内存(树可以很大)。这是我的代码:

def paths(self, acc=[]):
    if self.is_leaf():
        yield [self.node]+acc

    for child in self.children:
        child.paths([self.node]+acc)

但它不起作用。为什么?在root用户调用时,它从上到下遍历树,在“acc”中收集节点。 “acc”应该在每一片叶子中归还......

如果self.children为空,则

is_leaf()为真。

2 个答案:

答案 0 :(得分:7)

此代码仅生成叶子(根)的(直接)子代。其他的被访问,它们屈服于上层函数,但上层函数对它们没有任何作用。你需要的是从低级函数到高级函数:

def paths(self, acc=[]):
    if self.is_leaf():
        yield [self.node]+acc

    for child in self.children:
        for leaf_path in child.paths([self.node]+acc): # these two
            yield leaf_path                            # lines do that

这应该可以解决问题。

答案 1 :(得分:1)

目前for循环没有yield任何内容。它应该产生递归调用生成的所有元素:

for child in self.children:
    for path in child.paths([self.node]+acc):
        yield path