पूंछ रिकर्सन के अलावा कोई पूंछ कॉल अनुकूलन संभव है? मैं उस व्यक्ति को खोजने या सोचने की कोशिश कर रहा हूं जिसमें रिकर्सन शामिल नहीं है, लेकिन कोई सफलता नहीं है। क्या यह संभव है? कोई उदाहरण?टेल रिकर्सन के अलावा टेल कॉल ऑप्टिमाइज़ेशन?
उत्तर
int bar(int x);
int foo(int x) { return bar(x); }
foo
बस bar
जो फोन करने वाले सीधे रिटर्न के लिए कूद कर सकते हैं; कहीं भी कोई रिकर्सन आवश्यक नहीं है।
लेकिन क्या यह सरल इनलाइनिंग नहीं है? वास्तव में "पूंछ कॉल अनुकूलन" आईएमओ नहीं ... – dtech
@ddriver: मैंने केवल 'बार' की परिभाषा ली, केवल इसकी घोषणा छोड़ दी। आप इसकी परिभाषा के बिना 'बार' इनलाइन नहीं कर सकते हैं, लेकिन आप अपने कॉलर्स पर पूंछ-कॉल अनुकूलन कर सकते हैं। फर्क देखें? – Mehrdad
यह वास्तव में कार्यों की संभावित पारस्परिक रूप से पुनरावर्ती जोड़ी का आधा है ... –
निश्चित रूप से, "पूंछ कॉल अनुकूलन" वास्तव में इस तरह के अनुकूलन के लिए अपने सबसे सामान्य, रिकर्सन-अज्ञेयवादी रूप में शब्द है। यह अनुकूलन while
लूप या उसके जैसा कुछ समकक्ष के साथ रिकर्सन को प्रतिस्थापित नहीं करता है। इसके बजाए, पूंछ कॉल इस प्रकार परिवर्तित हो जाते हैं कि कॉलर के ढेर फ्रेम का पुन: उपयोग किया जाता है। कोई फॉर्म return f(...)
या f(...); return
का कोड इस में संशोधन योग्य है। यह किसी भीf
के लिए भी काम करता है, यहां तक कि फ़ंक्शन पॉइंटर्स/क्लोजर/वर्चुअल विधियों के लिए भी जहां संकलक संभवतः नहीं जानता कि क्या कहा जा रहा है। इसलिए यह अलग संकलन, उच्च-आदेश कार्यों, देर से बाध्यकारी, आदि के साथ भी बेहतर काम करता है
यदि आप पर्याप्त कोड देखते हैं, तो यह कार्यात्मक या अनिवार्य हो, आपको कभी-कभार कॉल मिलेंगी जो कुछ भी नहीं होती हैं। एक आम मामला तब होता है जब कॉलर मुख्य कार्य के लिए कैली में प्रतिनिधि होता है और केवल कुछ अतिरिक्त तैयारी करता है। कार्यात्मक कोड में, आपको अक्सर कई छोटे कार्य मिलेंगे जो केवल एक चीज करते हैं और अन्य छोटे कार्यों के संदर्भ में लागू किए जाते हैं, इसलिए आप तर्कों में एक सरल परिवर्तन लागू करने की कई परतों के साथ हवादार होते हैं, फिर एक पूंछ कॉल करते हैं अगली परत (रूपांतरित डेटा के साथ तर्क के रूप में)। टीसीओ दूसरे चरण को अनुकूलित करता है, यह (आदर्श) कॉल को सरल jump
के रूप में सस्ता बनाता है और अच्छा, मॉड्यूलर कोड अधिक मोनोलिथिक कार्यान्वयन की तुलना में थोड़ा स्टैक स्पेस लेता है। एक वस्तु उन्मुख डिजाइन में आप अन्य वस्तुओं की एक वस्तु की रचना और बेनकाब सुविधा तरीकों कि प्रतिनिधि कर सकते हैं:
SomeClass doSomething(Argument a) {
log.debug("Doing something");
return this.somethingDoer.doIt(a, this.someExtraData);
}
एक और उदाहरण है कि दर्जनों के साथ तकनीकी रूप से परस्पर पुनरावर्ती है, लेकिन आमतौर पर केवल किसी भी समारोह के बहुत कम सक्रियण है (या) के बीच में अन्य सक्रियण, के सैकड़ों राज्य राज्य प्रति एक समारोह होने हैं और यह बुला है कि राज्य में प्रवेश करने के द्वारा कार्यान्वित मशीनें हैं:
void stateA() {
// do actual work
// determine which transition applies
stateB();
}
void stateB() {
// do actual work
// determine which transition applies
state...();
}
// dozens, possibly hundreds of other states
- 1. क्या रूबी टेल कॉल ऑप्टिमाइज़ेशन करता है?
- 2. टेल कॉल ऑप्टिमाइज़ेशन और आरएआईआई सह-अस्तित्व कर सकते हैं?
- 3. यूनिट परीक्षण शून्य विधियों/मॉकिंग ऑब्जेक्ट टेल-टेल संकेत
- 4. स्कैला/सी ++: इनपुट लूप के बजाय टेल रिकर्सिव फ़ंक्शन
- 5. एक टेल में एक विराम डालना: // लिंक
- 6. पावरहेल - टेल विंडोज इवेंट लॉग? क्या यह संभव है?
- 7. मोनो (2.11) पर एफ # के लिए पूंछ-कॉल-ऑप्टिमाइज़ेशन की वर्तमान स्थिति क्या है?
- 8. कुछ आसान एफ # कोड क्या है जो .टेल आईएल निर्देश उत्पन्न करता है?
- 9. क्या अब <इनपुट प्रकार = "टेल" /> का उपयोग करना ठीक है?
- 10. प्रोग्रामिंग के लिए जावा/कोटलिन का उपयोग करते समय टेल रिकर्सन या इटरेटिव संस्करण का उपयोग करने की सिफारिश की जाती है? प्रदर्शन में कोई अंतर है?
- 11. कंस्ट्रैक्स फ़ंक्शन मूल्यांकन कर सकते हैं पूंछ रिकर्सन ऑप्टिमाइज़ेशन
- 12. क्या स्कैला समर्थन पूंछ रिकर्सन ऑप्टिमाइज़ेशन का समर्थन करता है?
- 13. जेवीएम कार्यान्वयन के बीच मतभेद
- 14. django 1.7 gotcha - django.setup() आकस्मिक रिकर्सन कॉल
- 15. जावास्क्रिप्ट रिकर्सन: अधिकतम कॉल स्टैक आकार
- 16. रिकर्सन
- 17. रिकर्सन
- 18. रिकर्सन
- 19. रिकर्सन
- 20. एरलंग
- 21. क्लोजर में पूंछ रिकर्सन
- 22. रिकर्सन
- 23. रिकर्सन
- 24. रिकर्सन
- 25. रिकर्सन
- 26. रिकर्सन
- 27. रिकर्सन
- 28. रिकर्सन
- 29. रिकर्सन
- 30. सी ++ 64-बिट चर का उपयोग कर पूंछ रिकर्सन
[निरंतरता] (http://en.wikipedia.org/wiki/Continuation -पासिंग_स्टाइल "निरंतरता-गुजरने वाली शैली" के लिए विकिपीडिया लेख ") पूंछ कॉल अनुकूलन के लिए अर्हता प्राप्त कर सकता है। – stakx