2009-06-01 19 views
15

मैं पूरी तरह से पाइथन और रिकर्सिव फ़ंक्शंस के लिए बिल्कुल नया हूं, इसलिए मेरी अज्ञानता को क्षमा करें।पायथन रिकर्सन और रिटर्न स्टेटमेंट

मैं अजगर में एक द्विआधारी खोज वृक्ष को लागू करने और निम्नलिखित डालने विधि (एक वर्ग से बाहर ले जाया) के लिए कोशिश कर रहा हूँ:

def insert(self, key, root=None): 
    '''Inserts a node in the tree''' 
    if root == None: 
     root = self.root 
    if root.key == None: 
     self._update(root, key) 
     return 0 
    else: 
     tmp = root 
     if key > tmp.key: # we work with the right subtree 
      self.insert(key, root=tmp.right) 
     elif key < tmp.key: # we work with the left subtree 
      self.insert(key, root=tmp.left) 
     else: # key already exists 
      return 0 

मुझे यकीन है कि अगर यह सुपाठ्य है नहीं कर रहा हूँ, लेकिन इसे ट्रावर्स पेड़ जब तक यह किसी भी मूल्य के लिए नहीं मिलता है और डालने के लिए कुंजी के साथ नोड अद्यतन करता है।

अब, विधि अच्छी तरह से काम करती है और सही ढंग से स्क्रैच से बीएसटी बनाती है। लेकिन रिटर्न स्टेटमेंट में कोई समस्या है, क्योंकि अगर कोई रिकर्सन नहीं किया जाता है तो यह केवल 0 लौटाता है।

>>> bst.insert(10) 
0 
>>> bst.insert(15) 
>>> bst.root.right.key 
15 
>>> 

रूट कुंजी "डालने" फिर से 0 (लाइन 15 से) को वापस लौटाता है।

>>> bst.insert(10) 
0 

मुझे यह नहीं पता कि ऐसा क्यों होता है। अगर मैं लाइन 6 में एक प्रिंट स्टेटमेंट डालता हूं, तो यह सही तरीके से निष्पादित होता है, फिर भी यह पहले सम्मिलन से पहले कुछ भी वापस नहीं करेगा। ऐसा क्यों है?

आपकी मदद के लिए धन्यवाद (मैं यकीन है कि मैं कुछ बुनियादी अजगर और प्रत्यावर्तन के बारे में जानकारी याद कर रहा हूँ कर रहा हूँ),

इवान

पुनश्च: मैं पढ़ा है कि प्रत्यावर्तन का सबसे अच्छा तरीका नहीं है एक बीएसटी लागू करें, इसलिए मैं अन्य समाधानों को देखूंगा, लेकिन आगे बढ़ने से पहले मैं इसका जवाब जानना चाहता हूं।

+0

मुझे यकीन नहीं है कि आपको क्या लगता है कि इसे वापस करना चाहिए, 0 से भी कम। क्या आप दिखा सकते हैं कि आप क्या उम्मीद कर रहे हैं? –

+0

@imiric: मुझे लगता है कि आपको दूसरों से कुछ सहायक पॉइंटर्स मिल गए हैं, लेकिन मैं यह भी इंगित करना चाहूंगा कि वापसी की स्थिति छोड़ने के लिए आपकी प्रवीणता आपको सुझाव दे सकती है कि आप बयानों के बजाय अभिव्यक्तियों में सोचें। यदि ऐसा है, तो शायद योजना जैसी एक भाषा आपको अनुकूल करेगी। आपको निश्चित रूप से पायथन पर छोड़ना नहीं है, लेकिन अपने दिमाग को कार्यात्मक प्रोग्रामिंग भाषाओं में खोलें।ZoP से उद्धरण के लिए –

उत्तर

23

अपनी रिकर्सिव लाइनों पर, आप कुछ भी वापस नहीं करते हैं। आप इसे 0 लौटना चाहते हैं, तो आप उनकी तरह लाइनों के साथ बदलना चाहिए:

return self.insert(key, root=tmp.left) 
बजाय

सिर्फ

self.insert(key, root=tmp.left) 
18

आप एक समारोह के अंदर हैं और एक मूल्य के वापस जाने के लिए चाहते हैं, आप क्या करते हैं? आप

def function(): 
    return value 

बारे में अपने मामले में आप एक समारोह कॉल द्वारा दिए गए मान वापस करना चाहते है, तो आप क्या करना है।

def function(): 
    return another_function() 

हालांकि आप

def function(): 
    another_function() 

क्यों आपको लगता है कि है कि काम करना चाहिए? बेशक आप रिकर्सन का उपयोग करते हैं लेकिन ऐसे मामले में आपको जेन ऑफ पायथन को याद रखना चाहिए जो कि बस कहता है:

विशेष मामले नियम तोड़ने के लिए पर्याप्त नहीं हैं।

+0

+1 – whytheq

संबंधित मुद्दे