5

पूंछ रिकर्सन के अलावा कोई पूंछ कॉल अनुकूलन संभव है? मैं उस व्यक्ति को खोजने या सोचने की कोशिश कर रहा हूं जिसमें रिकर्सन शामिल नहीं है, लेकिन कोई सफलता नहीं है। क्या यह संभव है? कोई उदाहरण?टेल रिकर्सन के अलावा टेल कॉल ऑप्टिमाइज़ेशन?

+0

[निरंतरता] (http://en.wikipedia.org/wiki/Continuation -पासिंग_स्टाइल "निरंतरता-गुजरने वाली शैली" के लिए विकिपीडिया लेख ") पूंछ कॉल अनुकूलन के लिए अर्हता प्राप्त कर सकता है। – stakx

उत्तर

1
int bar(int x); 
int foo(int x) { return bar(x); } 

foo बस bar जो फोन करने वाले सीधे रिटर्न के लिए कूद कर सकते हैं; कहीं भी कोई रिकर्सन आवश्यक नहीं है।

+0

लेकिन क्या यह सरल इनलाइनिंग नहीं है? वास्तव में "पूंछ कॉल अनुकूलन" आईएमओ नहीं ... – dtech

+0

@ddriver: मैंने केवल 'बार' की परिभाषा ली, केवल इसकी घोषणा छोड़ दी। आप इसकी परिभाषा के बिना 'बार' इनलाइन नहीं कर सकते हैं, लेकिन आप अपने कॉलर्स पर पूंछ-कॉल अनुकूलन कर सकते हैं। फर्क देखें? – Mehrdad

+0

यह वास्तव में कार्यों की संभावित पारस्परिक रूप से पुनरावर्ती जोड़ी का आधा है ... –

3

निश्चित रूप से, "पूंछ कॉल अनुकूलन" वास्तव में इस तरह के अनुकूलन के लिए अपने सबसे सामान्य, रिकर्सन-अज्ञेयवादी रूप में शब्द है। यह अनुकूलन 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 
संबंधित मुद्दे

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