私は幅の深さ優先のツリートラバーサル関数を書いています。私がやりたいことはこれです:
def traverse(node):
yield node
for n in node.children:
yield_all traverse(n) # << if Python had a yield_all statement
アイデアは、ツリー内のノードの (フラットな) シーケンスで終わることです。
アプローチ #1: (利回りの伝播)
def traverse(node):
yield node
for n in node.children:
for m in traverse(n):
yield m
アプローチ #2: (フラット化シーケンス)
def traverse(node):
return itertools.chain([node],*(traverse(n) for n in node.children))
yield
最初のアプローチはよりクリーンに見えますが、各レベルでサブツリーの各ノードを明示的に指定するのは奇妙に感じます。
2 番目のアプローチは簡潔で少し汚れていますが、Haskell で記述したものと一致します。
traverse node = node : concatMap traverse (children node)
だから私の質問は:どちらが良いですか?または、最適な 3 番目のオプションがありませんか?