簡體   English   中英

帶有遞歸調用的Python生成器

[英]Python generator with recursive call

我試圖使用預先深度優先搜索的生成器在樹中生成節點。 父節點可以具有任意數量的子節點,子節點存儲在列表中。

我認為這個代碼可以工作,但似乎for循環遍歷每個子進程而不實際進入遞歸調用。

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

有誰知道如何處理這個?

如果查看函數,對於每次調用, 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

看看這個答案使用yield進行遞歸 ,更具體地說是這里的構造yield fromhttps//docs.python.org/3/whatsnew/3.3.html#pep-380

當您調用包含yield的函數時,函數體中的代碼不會運行。 相反,它返回一個生成器對象。

您可以使用列表來存儲結果:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM