अनाम पुनरावर्तन

कंप्यूटर विज्ञान में, अनाम रिकर्सन रिकर्सन (कंप्यूटर विज्ञान) है जो स्पष्ट रूप से किसी फ़ंक्शन को नाम से नहीं बुलाता है। यह या तो स्पष्ट रूप से, उच्च-क्रम वाले फ़ंक्शन का उपयोग करके किया जा सकता है - किसी फ़ंक्शन को एक तर्क के रूप में पारित करना और उसे कॉल करना - या परोक्ष रूप से, प्रतिबिंब (कंप्यूटर प्रोग्रामिंग) सुविधाओं के माध्यम से जो किसी को वर्तमान संदर्भ, विशेष रूप से वर्तमान फ़ंक्शन या कभी-कभी वर्तमान फ़ंक्शन के कॉलिंग फ़ंक्शन के आधार पर कुछ कार्यों तक पहुंचने की अनुमति देता है।

प्रोग्रामिंग अभ्यास में, जावास्क्रिप्ट में अनाम रिकर्सन का विशेष रूप से उपयोग किया जाता है, जो इसका समर्थन करने के लिए प्रतिबिंब सुविधाएं प्रदान करता है। हालाँकि, सामान्य प्रोग्रामिंग अभ्यास में, इसे खराब शैली माना जाता है, और इसके बजाय नामित कार्यों के साथ रिकर्सन का सुझाव दिया जाता है। कार्यों को तर्कों के रूप में स्पष्ट रूप से पारित करने के माध्यम से अज्ञात पुनरावृत्ति किसी भी भाषा में संभव है जो तर्कों के रूप में कार्यों का समर्थन करती है, हालांकि व्यवहार में इसका उपयोग शायद ही कभी किया जाता है, क्योंकि यह नाम से स्पष्ट रूप से पुनरावृत्ति की तुलना में अधिक लंबा और कम स्पष्ट है।

सैद्धांतिक कंप्यूटर विज्ञान में, अनाम रिकर्सन महत्वपूर्ण है, क्योंकि यह दर्शाता है कि कोई नामित कार्यों की आवश्यकता के बिना रिकर्सन लागू कर सकता है। यह लैम्ब्डा कैलकुलस के लिए विशेष रूप से महत्वपूर्ण है, जिसमें अनाम यूनरी फ़ंक्शन हैं, लेकिन किसी भी पुनरावर्ती फ़ंक्शन की गणना करने में सक्षम है। इस अनाम रिकर्सन को निश्चित-बिंदु कॉम्बिनेटर के माध्यम से सामान्य रूप से उत्पादित किया जा सकता है।

उपयोग
अनाम रिकर्सन का उपयोग मुख्य रूप से अज्ञात कार्यों के लिए रिकर्सन की अनुमति देने में किया जाता है, खासकर जब वे क्लोजर (कंप्यूटर विज्ञान) बनाते हैं या फ़ंक्शन के नाम बंधन से बचने के लिए कॉलबैक (कंप्यूटर प्रोग्रामिंग) के रूप में उपयोग किए जाते हैं।

अनाम रिकर्सन में मुख्य रूप से वर्तमान फ़ंक्शन को कॉल करना शामिल है, जिसके परिणामस्वरूप प्रत्यक्ष रिकर्सन होता है। अनाम अप्रत्यक्ष रिकर्सन संभव है, जैसे कि कॉलर (पिछले फ़ंक्शन) को कॉल करके, या, शायद ही कभी, कॉल स्टैक में और ऊपर जाकर, और इसे पारस्परिक रिकर्सन उत्पन्न करने के लिए श्रृंखलाबद्ध किया जा सकता है। वर्तमान फ़ंक्शन का स्व-संदर्भ ऑब्जेक्ट ओरिएंटेड प्रोग्रामिंग  में इस (कंप्यूटर प्रोग्रामिंग) कीवर्ड का एक कार्यात्मक समकक्ष है, जो किसी को वर्तमान संदर्भ को संदर्भित करने की अनुमति देता है।

अनाम रिकर्सन का उपयोग नामित फ़ंक्शंस के लिए भी किया जा सकता है, बल्कि उन्हें नाम से कॉल करना, यह निर्दिष्ट करना कि कोई वर्तमान फ़ंक्शन पर रिकर्सन कर रहा है, या किसी को उस नाम को बदलने की आवश्यकता के बिना फ़ंक्शन का नाम बदलने की अनुमति देना जहां यह स्वयं कॉल करता है। हालाँकि, प्रोग्रामिंग शैली के मामले में यह आम तौर पर नहीं किया जाता है।

नामित फ़ंक्शन
सामान्य विकल्प नामित फ़ंक्शंस और नामित रिकर्सन का उपयोग करना है। एक अनाम फ़ंक्शन को देखते हुए, यह या तो फ़ंक्शन में एक नाम बाइंड करके किया जा सकता है, जैसा कि जावास्क्रिप्ट में नामित फ़ंक्शन एक्सप्रेशन में होता है, या फ़ंक्शन को एक वेरिएबल में निर्दिष्ट करके और फिर वेरिएबल को कॉल करके किया जा सकता है, जैसा कि जावास्क्रिप्ट में फ़ंक्शन स्टेटमेंट में होता है। चूँकि जो भाषाएँ अनाम फ़ंक्शंस की अनुमति देती हैं, वे आम तौर पर इन फ़ंक्शंस को वेरिएबल्स (यदि प्रथम श्रेणी फ़ंक्शंस नहीं) को निर्दिष्ट करने की अनुमति देती हैं, तो कई भाषाएँ स्वयं फ़ंक्शन को संदर्भित करने का कोई तरीका प्रदान नहीं करती हैं, और स्पष्ट रूप से अनाम रिकर्सन को अस्वीकार करती हैं; उदाहरणों में गो (प्रोग्रामिंग भाषा) शामिल है। उदाहरण के लिए, जावास्क्रिप्ट में फैक्टोरियल फ़ंक्शन को अज्ञात रिकर्सन के माध्यम से परिभाषित किया जा सकता है: नामित फ़ंक्शन अभिव्यक्ति का उपयोग करने के लिए पुनः लिखे जाने पर यह प्राप्त होता है:

फ़ंक्शंस को तर्क के रूप में पास करना
वर्तमान फ़ंक्शन या कॉलिंग फ़ंक्शन को संदर्भित करने के लिए तंत्र के बिना भी, ऐसी भाषा में अज्ञात रिकर्सन संभव है जो फ़ंक्शन को तर्क के रूप में अनुमति देता है। यह मूल पुनरावर्ती फ़ंक्शन में एक और पैरामीटर जोड़कर और पुनरावर्ती कॉल के लिए फ़ंक्शन के रूप में इस पैरामीटर का उपयोग करके किया जाता है। यह एक उच्च-क्रम फ़ंक्शन बनाता है, और इस उच्च फ़ंक्शन को पास करने से वास्तविक पुनरावर्ती फ़ंक्शन के भीतर अज्ञात रिकर्सन की अनुमति मिलती है। इस उच्च क्रम फ़ंक्शन पर एक निश्चित-बिंदु कॉम्बिनेटर लागू करके इसे पूरी तरह से गुमनाम रूप से किया जा सकता है। यह मुख्य रूप से अकादमिक रुचि का है, विशेष रूप से यह दिखाने के लिए कि लैम्ब्डा कैलकुलस में रिकर्सन है, क्योंकि परिणामी अभिव्यक्ति मूल नामित रिकर्सिव फ़ंक्शन की तुलना में काफी अधिक जटिल है। इसके विपरीत, फिक्स्ड-पॉइंटेड कॉम्बिनेटर्स के उपयोग को सामान्य रूप से अज्ञात रिकर्सन के रूप में संदर्भित किया जा सकता है, क्योंकि यह उनका एक उल्लेखनीय उपयोग है, हालांकि उनके पास अन्य अनुप्रयोग हैं। इसे नीचे पायथन का उपयोग करके दर्शाया गया है। सबसे पहले, रिकर्सन नामक एक मानक: उच्च-क्रम फ़ंक्शन का उपयोग करना ताकि शीर्ष-स्तरीय फ़ंक्शन किसी तर्क पर गुमनाम रूप से पुनरावृत्ति कर सके, लेकिन फिर भी तर्क के रूप में मानक पुनरावर्ती फ़ंक्शन की आवश्यकता होती है: हम फ़ंक्शन तर्क को कॉल में पास करके मानक पुनरावर्ती फ़ंक्शन को समाप्त कर सकते हैं: दूसरी पंक्ति को एक सामान्य उच्च-क्रम फ़ंक्शन द्वारा प्रतिस्थापित किया जा सकता है जिसे संयोजनात्मक तर्क कहा जाता है: गुमनाम रूप से लिखा गया: लैम्ब्डा कैलकुलस में, जो केवल एक ही चर के कार्यों का उपयोग करता है, यह फिक्स्ड-पॉइंट कॉम्बिनेटर के माध्यम से किया जा सकता है। पहले दो वेरिएबल्स के उच्च-क्रम वाले फ़ंक्शन को एक एकल वेरिएबल का एक फ़ंक्शन बनाएं, जो करी द्वारा सीधे एक फ़ंक्शन लौटाता है: यहां दो उच्च क्रम फ़ंक्शन को अपने आप में लागू करने वाले ऑपरेशन हैं:  पहली पंक्ति में और   क्षण में। कॉम्बिनेटरी लॉजिक में दूसरे दोहरे अनुप्रयोग का गुणनखंड करने से परिणाम मिलते हैं: अन्य दोहरे अनुप्रयोग प्रतिफलों को ध्यान में रखते हुए: दो कॉम्बिनेटरों को एक में मिलाने से फिक्स्ड-पॉइंट कॉम्बिनेटर प्राप्त होता है: Y कॉम्बिनेटर का विस्तार करने से परिणाम मिलते हैं: इनके संयोजन से लैम्ब्डा कैलकुलस (एकल चर के अज्ञात कार्य) में फैक्टोरियल की एक पुनरावर्ती परिभाषा प्राप्त होती है:

एपीएल
एपीएल (प्रोग्रामिंग भाषा) में, वर्तमान डीएफएनएस तक पहुंच योग्य है. यह अज्ञात रिकर्सन की अनुमति देता है, जैसे कि फैक्टोरियल के इस कार्यान्वयन में:

जावास्क्रिप्ट
जावास्क्रिप्ट में, वर्तमान फ़ंक्शन तक पहुंच योग्य है, जबकि कॉलिंग फ़ंक्शन के माध्यम से पहुंच योग्य है. ये अज्ञात रिकर्सन की अनुमति देते हैं, जैसे कि फैक्टोरियल के इस कार्यान्वयन में:

पर्ल
पर्ल 5.16 से शुरू होकर, वर्तमान सबरूटीन इसके माध्यम से पहुंच योग्य है  टोकन, जो वर्तमान सबरूटीन का संदर्भ लौटाता है, या   एक सबरूटीन के बाहर. यह अज्ञात रिकर्सन की अनुमति देता है, जैसे कि फैक्टोरियल के निम्नलिखित कार्यान्वयन में:

आर
आर (प्रोग्रामिंग भाषा) में, वर्तमान फ़ंक्शन का उपयोग करके कॉल किया जा सकता है. उदाहरण के लिए, हालाँकि, यह काम नहीं करेगा, यदि इसे किसी अन्य फ़ंक्शन के लिए तर्क के रूप में पारित किया जाता है, उदाहरण के लिए, अनाम फ़ंक्शन परिभाषा के अंदर। इस मामले में,   इस्तेमाल किया जा सकता है। उदाहरण के लिए, नीचे दिया गया कोड किसी सूची को पुनरावर्ती रूप से वर्गित करता है: