【问题标题】:Python generator with recursive call具有递归调用的 Python 生成器
【发布时间】:2016-08-05 11:49:21
【问题描述】:

我正在尝试使用预排序深度优先搜索生成带有生成器的树中的节点。父节点可以有任意数量的子节点,子节点存储在列表中。

我认为这段代码可以工作,但似乎 for 循环正在遍历每个孩子,而实际上并没有进入递归调用。

def traverse_tree(t):
    yield t.label, t.val
    for child in t.children:
        traverse_tree(child)

有人知道怎么处理吗?

【问题讨论】:

    标签: python recursion generator


    【解决方案1】:

    当您调用包含yield 的函数时,函数体中的代码不会运行。相反,它返回一个生成器对象。

    您可以使用列表来存储结果:

    def traverse_tree(t, list):
        list.append((t.label, t.val))
        for child in t.children:
            traverse_tree(child, list)
    

    【讨论】:

      【解决方案2】:

      查看这个答案Recursion using yield,更具体地说,这里是yield from 构造:https://docs.python.org/3/whatsnew/3.3.html#pep-380

      【讨论】:

        【解决方案3】:

        如果您查看函数,对于每次调用,yield 表达式只会被命中一次。所以你的生成器只会产生一件事。要让它产生不止一件事,你也需要让孩子们产生:

        def traverse_tree(t):
            yield t.label, t.val
            for child in t.children:
                yield from traverse_tree(child)
        

        这是 python 3.3+ 语法 (IIRC)。对于早期版本:

        def traverse_tree(t):
            yield t.label, t.val
            for child in t.children:
                for label, val in traverse_tree(child):
                    yield label, val
        

        【讨论】:

          猜你喜欢
          • 2021-05-22
          • 2016-05-03
          • 2017-11-18
          • 2012-05-03
          • 1970-01-01
          • 2016-06-09
          • 2013-09-16
          • 2013-05-19
          • 2010-10-25
          相关资源
          最近更新 更多