दिलचस्प पोस्ट
सदस्य क्रमबद्ध नहीं कर सकते … क्योंकि यह एक इंटरफ़ेस है Jquery का उपयोग करते हुए एक को छोड़कर सभी तत्वों को छिपाने के लिए कैसे? एक UIView (आईफ़ोन) में संवर्द्धित आरेखण क्लिपबोर्ड पर डेटा की सुरक्षित प्रतिलिपि के लिए फ़्लैश-आधारित ज़ीरोक्लिपबोर्ड के लिए एचटीएमएल 5 वैकल्पिक? चयन क्यों * हानिकारक माना जाता है? PHP में वस्तु की संरक्षित संपत्ति कैसे प्राप्त करें क्या Python के Virtualenv के दूसरे संस्करण को स्थापित करना संभव है? LINQ का प्रयोग करके अल्फ़ान्यूमेरिक सॉर्टिंग एकाधिक जावास्क्रिप्ट / सीएसएस फ़ाइलें: सर्वोत्तम प्रथाओं? सीएबी के साथ कस्टम सूची दृश्य में एकाधिक चयन PHP न्यूनतम उदाहरण के लिए फेसबुक एसडीके v4 रेल: एक नियंत्रक से एक और नियंत्रक कार्रवाई कॉल करें गेटर्स और सेटर्स खराब ओ ओ डिजाइन हैं? क्या एक async एपीआई कभी सिंक्रोनस फेंकता है? Java अनुप्रयोग में XML फ़ाइल में पढ़ने का सबसे अच्छा / सरल तरीका क्या है?

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

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

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

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 में एक प्रिंट स्टेटमेंट लगाता हूं, यह सही तरीके से कार्यान्वित करता है, फिर भी यह पहली प्रविष्टि से पहले कुछ भी वापस नहीं लौटाएगा। ऐसा क्यों है? (मुझे पूरा यकीन है कि मुझे पायथन और रिकर्सन के बारे में कुछ बुनियादी जानकारी याद आ रही है)

आपकी सहायता के लिए धन्यवाद,

इवान

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

Solutions Collecting From Web of "अजगर पुनरावर्ती और रिटर्न स्टेटमेंट"

आपके रिकर्सिव लाइनों पर, आप कुछ भी वापस नहीं करते हैं यदि आप इसे 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() 

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

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