2014-04-17 12 views
7

मेरे पास कुछ रिकर्सिव बैकट्रैकिंग कोड है जो परीक्षण करता है कि इसे बनाने से पहले कोई विकल्प मान्य है या नहीं। क्या is_legal_choice रिकर्सिव solve फ़ंक्शन के अंदर फ़ंक्शन को घोंसला करना बुरा विचार है? क्या solve फ़ंक्शन को हर बार इस आंतरिक फ़ंक्शन को फिर से परिभाषित किया जाएगा?एक रिकर्सिव फ़ंक्शन के अंदर एक आंतरिक फ़ंक्शन को परिभाषित करना एक बुरा विचार है?

+3

समारोह * वस्तु * हर बार अपने कार्य कहा जाता है: बनाई जाएँगी। यह उतना बुरा नहीं है जितना लगता है; कोड ऑब्जेक्ट पहले से मौजूद है और फ़ंक्शन ऑब्जेक्ट सृजन अपेक्षाकृत हल्का वजन है। –

+0

यदि यह रखरखाव/पठनीयता परिप्रेक्ष्य से आपको समझ में आता है, तो फ़ंक्शन ऑब्जेक्ट निर्माण ओवरहेड के बारे में बहुत चिंता न करें। –

+0

@MartijnPieters: मैं यह करूँगा ... धन्यवाद! – rookie

उत्तर

5

हां, समारोह के हर बार आंतरिक कार्य को फिर से परिभाषित किया जाएगा। हालांकि, यह उतना बुरा नहीं है जितना आप मान सकते हैं; पाइथन कोड को एक बार कोड ऑब्जेक्ट में पार्स किया जाता है, और केवल फ़ंक्शन ऑब्जेक्ट (जो कोड ऑब्जेक्ट के लिए रैपर के प्रकार के रूप में कार्य करता है) हर बार नया बनाया जाता है।

+0

आपके उत्तर के लिए धन्यवाद। यह समझ में आता है और जानकारीपूर्ण है! – rookie

1

हां, इसे हर बार कॉल करने के लिए फिर से परिभाषित किया जाएगा। हालांकि, यह हमेशा एक बुरा विचार नहीं है। इस तरह आप एक बंद कर देंगे, जो कभी-कभी उपयोगी होता है।

यदि आपके is_legal_choice फ़ंक्शन को कुछ डेटा का उपयोग करने की आवश्यकता है जो केवल बाहरी फ़ंक्शन के दायरे में उपलब्ध है, तो मैं इसके लिए कहूंगा। प्रदर्शन ओवरहेड बहुत बड़ा नहीं होगा (यदि आपको आवश्यकता हो तो आप हमेशा प्रोफाइल कर सकते हैं)।

यदि is_legal_choice को solve के पैरामीटर से किसी भी डेटा की आवश्यकता नहीं है, तो जो भी आपके कोड को सबसे समझ में आता है।

आप गूगल के साथ बंद होने में अधिक जानकारी प्राप्त कर सकते हैं, लेकिन यहाँ एक उदाहरण है: http://ynniv.com/blog/2007/08/closures-in-python.html

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