2011-08-20 6 views
5

मैं प्रत्येक पेड़ से सभी पेड़ों को एक पेड़ में रूट करना चाहता हूं। मैं जनरेटर के साथ ऐसा करना चाहता हूं, स्मृति को बचाने के लिए (पेड़ बड़ा हो सकता है)। यहां मेरा कोड है:पायथन (उपज): पत्तियों से रूट के सभी पथ एक पेड़ में रूट

def paths(self, acc=[]): 
    if self.is_leaf(): 
     yield [self.node]+acc 

    for child in self.children: 
     child.paths([self.node]+acc) 

लेकिन यह काम नहीं करता है। क्यूं कर? जड़ पर बुलाया गया, यह पेड़ को "एसीसी" में नोड एकत्रित करने से ऊपर से नीचे तक पेड़ को पार करता है। "एसी" प्रत्येक पत्ते में वापस किया जाना चाहिए ...

is_leaf() सच है अगर self.children खाली है।

उत्तर

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 

यह चाल चलाना चाहिए।

+0

मैंने हमेशा सोचा है - क्या कोई त्वरित "उपज सब कुछ" कमांड है, या आपके द्वारा लिखे गए 'लूप' के लिए सबसे छोटा है? – Owen

+0

@ ओन नोप, लेकिन मुझे यह ठीक लगता है, यह केवल दो सरल रेखाएं हैं ... –

+5

पायथन 3.3 में 'उपज से' उपज होगी जो स्वचालित रूप से अन्य जनरेटर से आइटम उत्पन्न करेगी, इसलिए कोई भी 'लूप' इसमें 'उपज' के साथ आप एक जनरेटर अभिव्यक्ति के रूप में लिख सकते हैं एक पंक्ति में बनाया जा सकता है। – agf

1

इस समय for लूप yield कुछ भी नहीं है। यह बजाय सभी तत्वों को पुनरावर्ती कॉल द्वारा उत्पन्न कर रहे उपज चाहिए:

for child in self.children: 
    for path in child.paths([self.node]+acc): 
     yield path 
संबंधित मुद्दे