दिलचस्प पोस्ट
स्काला में गतिशील मिक्सिन – क्या यह संभव है? एक सरणी में सबसे अधिक मूल्य ढूँढना सबसे कुशलतापूर्वक जावास्क्रिप्ट – भारी काम करते समय ब्राउज़र को अवरुद्ध करने से कैसे बचें? स्विफ्ट | बाधाओं को प्रोग्रामेटिक रूप से जोड़ना अजगर में एकाधिक फ़ाइलों की प्रतिलिपि बनाएँ सूचकांक द्वारा सरणी में तत्वों को स्थानांतरित करें तरीके डेटाबेस में enums बचाने के लिए HTML.ActionLink एक बटन या एक छवि के रूप में, एक लिंक नहीं Std :: सेट के मौजूदा तत्व को कैसे अद्यतन करें? अक्ष शीर्षक को ग्रीक वर्ण जोड़ना सीएसएस: div का खड़ा रूप से संरेखित करें जब div का कोई निश्चित आकार ज्ञात नहीं होता है एक स्ट्रिंग के रूप में संग्रहीत JavaScript कोड निष्पादित करें Google ऐप स्क्रिप्ट टाइमआउट ~ 5 मिनट? सीएलआई उपकरण के लिए डीजेन्गा का उपयोग करना पायथन में इंस्टेंस चर बनाम क्लास चर

अजगर पुनरावर्ती और रिटर्न स्टेटमेंट

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

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

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 पर लौटने के लिए चाहते हैं, तो आपको उन्हें लाइनों के साथ बदलना चाहिए:

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

बस के बजाय

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

आप एक फ़ंक्शन के अंदर हैं और एक मान वापस करना चाहते हैं, तो आप क्या करते हैं? तुम लिखो

 def function(): return value 

आपके मामले में आप फ़ंक्शन कॉल द्वारा दिए गए मान को वापस करना चाहते हैं, इसलिए आपको करना होगा।

 def function(): return another_function() 

हालांकि आप करते हैं

 def function(): another_function() 

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

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