我想生成树中每个叶子到根的所有路径。我想用发电机来做,以节省内存(树可以很大)。这是我的代码:
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()为真。
答案 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