2016-04-14 19 views
3

Bir önizleme derinliği ilk arama kullanılarak bir jeneratörde bir ağaçta düğümler oluşturmaya çalışıyorum. Ebeveynler düğümünün herhangi bir sayıda çocuğu olabilir ve çocuklar bir listede saklanır.Özyinelemeli çağrı ile Python üreteci

Bu kodun işe yarayacağını düşündüm, ancak for döngüsü yinelemeli aramaya gerçekten gitmeden her çocuğun üzerinde yineleme yapıyor gibi görünüyor.

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

Bunu nasıl yapacağını bilen var mı?

cevap

2

Bu işleve bakarsanız, her arama için yield ifadesi yalnızca bir kez vurulur. Yani jeneratörünüz sadece bir şey verecektir. Birden fazla şey elde etmek elde etmek için, çok çocuklardan elde etmek gerekir:

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

Bu piton 3.3+ sözdizimi (IIRC). önceki sürümleri için:

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

yield'u içeren işlevi çağırdığınızda, işlevin gövdesindeki kod çalışmaz. Bunun yerine, bir jeneratör nesnesini döndürür.

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

yerine sonucu depolamak için bir listeyi kullanabilirsiniz