जैसा कि अन्य उत्तर में कहा गया है, सीएलआर पूंछ कॉल अनुकूलन का समर्थन करता है और ऐसा लगता है कि यह ऐतिहासिक रूप से प्रगतिशील सुधारों के तहत था। लेकिन C # में इसका समर्थन करने Proposal
से C # प्रोग्रामिंग लैंग्वेज सपोर्ट टेल रिकर्सन # 2544 के डिजाइन के लिए git रिपॉजिटरी में एक ओपन इश्यू है ।
आप वहां कुछ उपयोगी विवरण और जानकारी पा सकते हैं। उदाहरण के लिए @jaykrell का उल्लेख किया गया है
मुझे जो पता है वह मुझे देने दो।
कभी-कभी टेलकॉल एक प्रदर्शन जीत-जीत है। यह CPU को बचा सकता है। jmp कॉल / रेट से सस्ता है यह स्टैक को बचा सकता है। कम स्टैक को छूना बेहतर इलाके के लिए बनाता है।
कभी-कभी टेलकॉल एक प्रदर्शन हानि, स्टैक जीत है। सीएलआर में एक जटिल तंत्र है जिसमें कॉल करने वाले की तुलना में कैली को अधिक पैरामीटर पारित करना है। मेरा मतलब है कि मापदंडों के लिए विशेष रूप से अधिक स्टैक स्पेस। यह धीमा है। लेकिन यह ढेर को संरक्षित करता है। यह केवल पूंछ के साथ ऐसा करेगा। उपसर्ग।
यदि कॉलर पैरामीटर कैलली पैरामीटर से अधिक बड़े होते हैं, तो यह आमतौर पर एक बहुत आसान जीत-जीत रूपांतरण होता है। पैरामीटर-स्थिति से लेकर पूर्णांक / फ्लोट तक, और सटीक StackMaps और इस तरह के उत्पन्न करने जैसे कारक हो सकते हैं।
अब, एक और कोण है, एल्गोरिदम का जो टेलक्लिम एलिमिनेशन की मांग करता है, नियत / छोटे स्टैक के साथ मनमाने ढंग से बड़े डेटा को प्रोसेस करने में सक्षम होने के प्रयोजनों के लिए। यह प्रदर्शन के बारे में नहीं है, लेकिन सभी को चलाने की क्षमता के बारे में है।
मुझे भी उल्लेख करना चाहिए (अतिरिक्त जानकारी के रूप में), जब हम System.Linq.Expressions
नेमस्पेस में अभिव्यक्ति वर्गों का उपयोग कर एक संकलित लैम्ब्डा उत्पन्न कर रहे हैं , तो 'tailCall' नाम का एक तर्क है, जैसा कि इसकी टिप्पणी में बताया गया है
एक बूल जो इंगित करता है कि निर्मित अभिव्यक्ति का संकलन करते समय पूंछ कॉल अनुकूलन लागू किया जाएगा।
मुझे अभी तक इसकी कोशिश नहीं की गई थी, और मुझे यकीन नहीं है कि यह आपके प्रश्न से संबंधित कैसे मदद कर सकता है, लेकिन संभवतः कोई इसे आज़मा सकता है और कुछ परिदृश्यों में उपयोगी हो सकता है:
var myFuncExpression = System.Linq.Expressions.Expression.Lambda<Func< … >>(body: … , tailCall: true, parameters: … );
var myFunc = myFuncExpression.Compile();
preemptive
(उदाहरणार्थ एल्गोरिथ्म) औरNon-preemptive
(जैसे एकरमैन फ़ंक्शन) में विभाजित करता है। लेखक ने सिर्फ दो उदाहरण दिए हैं जिनका उल्लेख मैंने इस द्विभाजन के पीछे एक उचित तर्क दिए बिना किया है। क्या यह द्विभाजन पूंछ और गैर-पूंछ पुनरावर्ती कार्यों के समान है?