पुनरावृत्ति की आधुनिक समझ: कार्यक्षमता की परिभाषा और उस तक बाहर से और इस कार्यक्षमता से पहुंच। ऐसा माना जाता है कि पुनरावर्तन का जन्म गणितज्ञों द्वारा किया गया था: भाज्य गणना, अनंत श्रृंखला, भग्न, निरंतर भिन्न … हालांकि, पुनरावृत्ति हर जगह पाई जा सकती है। वस्तुनिष्ठ प्राकृतिक नियम पुनरावर्तन को अपने मुख्य एल्गोरिथ्म और अभिव्यक्ति के रूप (अस्तित्व) के रूप में "विचार" करते हैं, भौतिक दुनिया की वस्तुओं का इतना अधिक नहीं, बल्कि सामान्य रूप से आंदोलन का मुख्य एल्गोरिथ्म।
विज्ञान और प्रौद्योगिकी के विभिन्न क्षेत्रों में विभिन्न विशिष्टताओं के लोग पुनरावर्ती एल्गोरिथम f (x) का उपयोग करते हैं, जहां "x ~/=f (x)"। एक फ़ंक्शन जो स्वयं को बुलाता है वह एक मजबूत समाधान है, लेकिन इस समाधान को बनाना और समझना, ज्यादातर मामलों में, एक बहुत ही कठिन कार्य है।
प्राचीन काल में महल के स्थान को बढ़ाने के लिए पुनरावर्तन का प्रयोग किया जाता था। एक दूसरे पर निर्देशित दर्पणों की एक प्रणाली के माध्यम से, आप आश्चर्यजनक त्रि-आयामी स्थानिक प्रभाव बना सकते हैं। लेकिन क्या यह समझना इतना आसान है कि कैसे?इन दर्पणों को समायोजित करें? यह निर्धारित करना और भी कठिन है कि अंतरिक्ष में एक बिंदु कई दर्पणों के माध्यम से परिलक्षित होता है।
पुनरावर्ती, पुनरावर्ती एल्गोरिदम: अर्थ और वाक्य रचना
संचालन के अनुक्रम को दोहराकर तैयार की गई समस्या को पुनरावर्ती रूप से हल किया जा सकता है। एक साधारण एल्गोरिथम (एक द्विघात समीकरण की गणना, एक वेब पेज को जानकारी के साथ पॉप्युलेट करने के लिए एक स्क्रिप्ट, एक फ़ाइल पढ़ना, एक संदेश भेजना…) को पुनरावर्तन की आवश्यकता नहीं है।
एल्गोरिदम के मुख्य अंतर जो पुनरावर्ती समाधान की अनुमति देता है:
- एक एल्गोरिथम है जिसे कई बार निष्पादित करने की आवश्यकता होती है;
- एल्गोरिदम को डेटा की आवश्यकता होती है जो हर बार बदलता है;
- एल्गोरिदम को हर बार बदलना नहीं पड़ता;
- एक अंतिम शर्त है: एल्गोरिथ्म पुनरावर्ती है - अनंत नहीं।
सामान्य तौर पर, यह तर्क नहीं दिया जा सकता है कि पुनरावर्तन के लिए एक कारण की अनुपस्थिति के लिए एकमुश्त निष्पादन एक आवश्यक शर्त है। आपको अनिवार्य अंतिम शर्त की भी आवश्यकता नहीं हो सकती है: अनंत रिकर्सन का अपना दायरा होता है।
एल्गोरिदम पुनरावर्ती है: जब संचालन का एक क्रम बार-बार किया जाता है, डेटा पर जो हर बार बदलता है और हर बार एक नया परिणाम देता है।
पुनरावर्ती सूत्र
पुनरावर्ती की गणितीय समझ और प्रोग्रामिंग में इसके एनालॉग अलग हैं। गणित, हालांकि प्रोग्रामिंग के संकेत हैं, लेकिन प्रोग्रामिंग बहुत उच्च क्रम का गणित है।
एक अच्छी तरह से लिखा हुआ एल्गोरिथम अपने लेखक की बुद्धि के दर्पण की तरह होता है। आमप्रोग्रामिंग में रिकर्सन फॉर्मूला "एफ (एक्स)" है, जहां "एक्स ~/=एफ (एक्स)" में कम से कम दो व्याख्याएं हैं। यहाँ "~" परिणाम की समानता या अनुपस्थिति है, और "=" फ़ंक्शन के परिणाम की उपस्थिति है।
पहला विकल्प: डेटा गतिकी।
- फ़ंक्शन "f(x)" में एक पुनरावर्ती और अपरिवर्तनीय एल्गोरिथम है;
- "x" और परिणाम "f(x)" में हर बार नए मान होते हैं, परिणाम "f(x)" इस फ़ंक्शन का नया "x" पैरामीटर है।
दूसरा विकल्प: कोड डायनामिक्स।
- फ़ंक्शन "f(x)" में कई एल्गोरिदम हैं जो डेटा को परिष्कृत (विश्लेषण) करते हैं;
- डेटा विश्लेषण - कोड का एक हिस्सा और वांछित क्रिया करने वाले पुनरावर्ती एल्गोरिदम का कार्यान्वयन - कोड का दूसरा भाग;
- फ़ंक्शन "f(x)" का परिणाम नहीं है।
कोई परिणाम सामान्य नहीं है। प्रोग्रामिंग गणित नहीं है, यहाँ परिणाम स्पष्ट रूप से उपस्थित होने की आवश्यकता नहीं है। एक पुनरावर्ती फ़ंक्शन केवल साइटों को पार्स कर सकता है और डेटाबेस को पॉप्युलेट कर सकता है, या आने वाले इनपुट के अनुसार वस्तुओं को तुरंत चालू कर सकता है।
डेटा और रिकर्सन
प्रोग्रामिंग रिकर्सिव एल्गोरिदम एक फैक्टोरियल की गणना के बारे में नहीं है, जिसमें फ़ंक्शन हर बार एक दिए गए मान को प्राप्त करता है जो एक से अधिक या कम होता है - कार्यान्वयन विकल्प डेवलपर की वरीयता पर निर्भर करता है।
कोई फर्क नहीं पड़ता कि कैसे भाज्य "8!",एल्गोरिथ्म जो इस सूत्र का सख्ती से पालन करता है।
प्रसंस्करण जानकारी एक पूरी तरह से अलग क्रम का "गणित" है। रिकर्सिव फ़ंक्शंस और एल्गोरिदम यहां अक्षरों, शब्दों, वाक्यांशों, वाक्यों और पैराग्राफ पर काम करते हैं। प्रत्येक अगला स्तर पिछले स्तर का उपयोग करता है।
इनपुट डेटा स्ट्रीम का विश्लेषण कई प्रकार की स्थितियों में किया जाता है, लेकिन विश्लेषण प्रक्रिया आम तौर पर पुनरावर्ती होती है। इनपुट स्ट्रीम के सभी प्रकारों के लिए अद्वितीय एल्गोरिदम लिखने का कोई मतलब नहीं है। एक कार्यक्षमता होनी चाहिए। यहां, रिकर्सिव एल्गोरिदम उदाहरण हैं कि इनपुट के लिए पर्याप्त आउटपुट स्ट्रीम कैसे बनाएं। यह पुनरावर्ती एल्गोरिथम का आउटपुट नहीं है, बल्कि यह वांछित और आवश्यक समाधान है।
एब्स्ट्रैक्शन, रिकर्सन और ओओपी
ऑब्जेक्ट-ओरिएंटेड प्रोग्रामिंग (OOP) और रिकर्सन मौलिक रूप से अलग-अलग इकाइयाँ हैं, लेकिन वे पूरी तरह से एक दूसरे के पूरक हैं। एब्स्ट्रैक्शन का रिकर्सन से कोई लेना-देना नहीं है, लेकिन ओओपी के लेंस के माध्यम से यह प्रासंगिक रिकर्सन को लागू करने की संभावना पैदा करता है।
उदाहरण के लिए, जानकारी को पार्स किया जा रहा है और अक्षरों, शब्दों, वाक्यांशों, वाक्यों और पैराग्राफ को अलग से हाइलाइट किया गया है। जाहिर है, डेवलपर इन पांच प्रकार की वस्तुओं के उदाहरणों के निर्माण के लिए प्रदान करेगा और प्रत्येक स्तर पर पुनरावर्ती एल्गोरिदम का समाधान प्रदान करेगा।
इस बीच, यदि अक्षरों के स्तर पर "अर्थ की तलाश करने का कोई मतलब नहीं है", तो शब्दों के स्तर पर शब्दार्थ दिखाई देता है। आप शब्दों को क्रिया, संज्ञा, क्रिया विशेषण, पूर्वसर्गों में विभाजित कर सकते हैं… आप आगे जाकर मामलों को परिभाषित कर सकते हैं।
वाक्यांश स्तर पर, शब्दार्थ विराम चिह्न और तर्क द्वारा पूरक हैशब्द संयोजन। वाक्यों के स्तर पर, शब्दार्थ का अधिक उत्तम स्तर पाया जाता है, और एक अनुच्छेद को एक पूर्ण विचार माना जा सकता है।
वस्तु-उन्मुख विकास गुणों और विधियों की विरासत को पूर्वनिर्धारित करता है और पूरी तरह से अमूर्त पूर्वज के निर्माण के साथ वस्तुओं के पदानुक्रम को शुरू करने का प्रस्ताव करता है। एक ही समय में, निस्संदेह, प्रत्येक वंश का विश्लेषण पुनरावर्ती होगा और तकनीकी स्तर पर कई पदों (अक्षरों, शब्दों, वाक्यांशों और वाक्यों) में बहुत अधिक भिन्न नहीं होगा। अनुच्छेद, पूर्ण विचारों की तरह, इस सूची से अलग हो सकते हैं, लेकिन वे सार नहीं हैं।
यह महत्वपूर्ण है कि एल्गोरिथम का भारी हिस्सा अमूर्त पूर्वज स्तर पर तैयार किया जा सकता है, इसे प्रत्येक वंश के स्तर पर डेटा और अमूर्त स्तर से बुलाए गए तरीकों से परिष्कृत किया जा सकता है। इस संदर्भ में, अमूर्तता पुनरावर्तन के लिए नए क्षितिज खोलती है।
ओओपी की ऐतिहासिक विशेषताएं
ओओपी दो बार सॉफ्टवेयर की दुनिया में आया है, हालांकि कुछ विशेषज्ञ आईटी प्रौद्योगिकियों के विकास में एक नए दौर के रूप में क्लाउड कंप्यूटिंग और वस्तुओं और वर्गों के बारे में आधुनिक विचारों के उद्भव को अलग कर सकते हैं।
ओओपी के आधुनिक संदर्भ में "ऑब्जेक्ट" और "ऑब्जेक्टिव" शब्द आमतौर पर पिछली शताब्दी के 50 और 60 के दशक के लिए जिम्मेदार हैं, लेकिन वे 1965 और सिमुला, लिस्प, अल्गोल, स्मॉलटाक के उद्भव से जुड़े हैं।.
उन दिनों, प्रोग्रामिंग विशेष रूप से विकसित नहीं हुई थी और क्रांतिकारी अवधारणाओं का पर्याप्त रूप से जवाब नहीं दे सकती थी। विचारों और प्रोग्रामिंग शैलियों का संघर्ष (सी/सी++ और पास्कल - ज्यादातर) अभी भी दूर था, और डेटाबेस अभी भी अवधारणात्मक रूप से बने थे।
80 के दशक के अंत और 90 के दशक की शुरुआत में, पास्कल में वस्तुएं दिखाई दीं और सभी को सी / सी ++ में कक्षाएं याद थीं - इसने ओओपी में रुचि के एक नए दौर को चिह्नित किया और यह तब था जब उपकरण, मुख्य रूप से प्रोग्रामिंग भाषाएं, नहीं बन गईं केवल वस्तु-उन्मुख विचारों का समर्थन करते हैं, लेकिन उसी के अनुसार विकसित होते हैं।
बेशक, यदि पहले रिकर्सिव एल्गोरिदम केवल प्रोग्राम के सामान्य कोड में उपयोग किए जाने वाले फ़ंक्शन थे, तो अब रिकर्सन किसी ऑब्जेक्ट (वर्ग) के गुणों का हिस्सा बन सकता है, जो विरासत के संदर्भ में दिलचस्प अवसर प्रदान करता है।
आधुनिक OOP की विशेषता
ओओपी के विकास ने शुरू में वस्तुओं (वर्गों) को डेटा और गुणों (विधियों) के संग्रह के रूप में घोषित किया। वास्तव में, यह डेटा के बारे में था जिसमें सिंटैक्स और अर्थ होता है। लेकिन तब वास्तविक वस्तुओं के प्रबंधन के लिए OOP को एक उपकरण के रूप में प्रस्तुत करना संभव नहीं था।
ओओपी "कंप्यूटर प्रकृति" वस्तुओं के प्रबंधन के लिए एक उपकरण बन गया है। एक स्क्रिप्ट, एक बटन, एक मेनू आइटम, एक मेनू बार, एक ब्राउज़र विंडो में एक टैग एक वस्तु है। लेकिन मशीन, खाद्य उत्पाद, शब्द या वाक्य नहीं। वास्तविक वस्तुएं ऑब्जेक्ट-ओरिएंटेड प्रोग्रामिंग से बाहर रह गई हैं, और कंप्यूटर टूल्स ने एक नया अवतार ले लिया है।
लोकप्रिय प्रोग्रामिंग भाषाओं में अंतर के कारण ओओपी की कई बोलियां उभरी हैं। शब्दार्थ के संदर्भ में, वे व्यावहारिक रूप से समकक्ष हैं, और वाद्य क्षेत्र पर उनका ध्यान, न कि लागू एक पर, वास्तविक वस्तुओं के विवरण को परे ले जाना संभव बनाता हैएल्गोरिदम और उनके क्रॉस-प्लेटफ़ॉर्म और क्रॉस-लैंग्वेज "अस्तित्व" को सुनिश्चित करते हैं।
स्टैक और फ़ंक्शन कॉल तंत्र
कार्यों (प्रक्रियाओं, एल्गोरिदम) को कॉल करने के लिए पासिंग डेटा (पैरामीटर) की आवश्यकता होती है, एक परिणाम लौटाता है, और ऑपरेटर के पते को याद रखता है जिसे फ़ंक्शन (प्रक्रिया) पूरा होने के बाद नियंत्रण प्राप्त करना चाहिए।
आमतौर पर, इस उद्देश्य के लिए स्टैक का उपयोग किया जाता है, हालांकि प्रोग्रामिंग भाषाएं या डेवलपर स्वयं नियंत्रण स्थानांतरित करने के लिए कई प्रकार के विकल्प प्रदान कर सकते हैं। आधुनिक प्रोग्रामिंग स्वीकार करती है कि किसी फ़ंक्शन का नाम न केवल एक पैरामीटर हो सकता है: इसे एल्गोरिथम के निष्पादन के दौरान बनाया जा सकता है। एक अन्य एल्गोरिथम को क्रियान्वित करते समय एक एल्गोरिथम भी बनाया जा सकता है।
पुनरावर्ती एल्गोरिदम की अवधारणा, जब उनके नाम और निकायों को कार्य के गठन के समय निर्धारित किया जा सकता है (वांछित एल्गोरिदम चुनना), न केवल कुछ कैसे करना है, बल्कि वास्तव में किसे करना चाहिए, इसके लिए पुनरावर्तीता का विस्तार करता है कर दो। एक एल्गोरिथम को उसके "सार्थक" नाम से चुनना आशाजनक है, लेकिन मुश्किलें पैदा करता है।
फ़ंक्शंस के एक सेट पर पुनरावर्तीता
आप यह नहीं कह सकते हैं कि एक एल्गोरिथ्म पुनरावर्ती है जब वह खुद को कॉल करता है और बस। प्रोग्रामिंग कोई हठधर्मिता नहीं है, और पुनरावर्तीता की अवधारणा स्वयं को अपने स्वयं के एल्गोरिथम के शरीर से कॉल करने के लिए एक विशेष आवश्यकता नहीं है।
व्यावहारिक अनुप्रयोग हमेशा एक साफ समाधान नहीं देते हैं। अक्सर, प्रारंभिक डेटा तैयार किया जाना चाहिए, और पुनरावर्ती कॉल के परिणाम का विश्लेषण संपूर्ण समस्या (संपूर्ण एल्गोरिथम) के संदर्भ में किया जाना चाहिएकुल मिलाकर।
वास्तव में, न केवल एक पुनरावर्ती फ़ंक्शन को कॉल करने से पहले, बल्कि इसके पूरा होने के बाद भी, किसी अन्य प्रोग्राम को कॉल किया जा सकता है या किया जाना चाहिए। यदि कॉल के साथ कोई विशेष समस्या नहीं है: रिकर्सिव फ़ंक्शन ए() फ़ंक्शन बी() को कॉल करता है, जो कुछ करता है और ए() को कॉल करता है, तो तुरंत नियंत्रण की वापसी में कोई समस्या होती है। पुनरावर्ती कॉल को पूरा करने के बाद, फ़ंक्शन ए () को बी () को फिर से कॉल करने के लिए नियंत्रण प्राप्त करना चाहिए, जो इसे फिर से कॉल करेगा। वापसी नियंत्रण जैसा कि स्टैक पर वापस बी() पर होना चाहिए, गलत समाधान है।
प्रोग्रामर मापदंडों के चुनाव में सीमित नहीं है और उन्हें फ़ंक्शन नामों के साथ पूरा कर सकता है। दूसरे शब्दों में, आदर्श समाधान यह है कि बी () से ए () का नाम पास किया जाए और ए () को खुद बी () कहा जाए। इस मामले में, वापसी नियंत्रण में कोई समस्या नहीं होगी, और पुनरावर्ती एल्गोरिथ्म का कार्यान्वयन अधिक पारदर्शी होगा।
पुनरावृत्ति की समझ और स्तर
पुनरावर्ती एल्गोरिदम विकसित करने में समस्या यह है कि आपको प्रक्रिया की गतिशीलता को समझने की आवश्यकता है। ऑब्जेक्ट विधियों में रिकर्सन का उपयोग करते समय, विशेष रूप से एक अमूर्त पूर्वज के स्तर पर, इसके निष्पादन समय के संदर्भ में अपने स्वयं के एल्गोरिदम को समझने में समस्या होती है।
वर्तमान में, कॉल मैकेनिज्म में फंक्शन के नेस्टिंग स्तर और स्टैक क्षमता पर कोई प्रतिबंध नहीं है, लेकिन समझने की समस्या है: किस समय किस डेटा स्तर या सामान्य एल्गोरिथम में किस स्थान को रिकर्सिव कहा जाता है काम करती हैं और वह खुद कितने कॉलों पर हैं।
मौजूदा डिबगिंग टूल अक्सर शक्तिहीन होते हैंप्रोग्रामर को सही समाधान बताएं।
लूप्स और रिकर्सन
यह माना जाता है कि चक्रीय निष्पादन पुनरावर्तन के बराबर है। दरअसल, कुछ मामलों में, पुनरावर्ती एल्गोरिदम को सशर्त और चक्रीय निर्माणों के सिंटैक्स में लागू किया जा सकता है।
हालांकि, अगर कोई स्पष्ट समझ है कि किसी विशेष फ़ंक्शन को पुनरावर्ती एल्गोरिदम के माध्यम से लागू किया जाना चाहिए, तो लूप या सशर्त बयानों के किसी भी बाहरी उपयोग को छोड़ दिया जाना चाहिए।
यहां अर्थ यह है कि एक फ़ंक्शन के रूप में एक पुनरावर्ती समाधान स्वयं का उपयोग करके एक पूर्ण, कार्यात्मक रूप से पूर्ण एल्गोरिदम होगा। इस एल्गोरिथम को एल्गोरिथम की गतिशीलता को समझने के लिए प्रोग्रामर को प्रयास के साथ इसे बनाने की आवश्यकता होगी, लेकिन यह अंतिम समाधान होगा जिसे बाहरी नियंत्रण की आवश्यकता नहीं है।
बाहरी सशर्त और चक्रीय ऑपरेटरों का कोई भी संयोजन हमें एक पूर्ण कार्य के रूप में पुनरावर्ती एल्गोरिथ्म का प्रतिनिधित्व करने की अनुमति नहीं देगा।
पुनरावर्ती आम सहमति और OOP
पुनरावर्ती एल्गोरिदम विकसित करने के लगभग सभी प्रकारों में, दो एल्गोरिदम विकसित करने की योजना बनाई जाती है। पहला एल्गोरिथ्म भविष्य की वस्तुओं (उदाहरणों) की एक सूची बनाता है, और दूसरा एल्गोरिथ्म वास्तव में एक पुनरावर्ती कार्य है।
सबसे अच्छा समाधान एक एकल संपत्ति (विधि) के रूप में रिकर्सन की व्यवस्था करना होगा जिसमें वास्तव में रिकर्सिव एल्गोरिदम होता है, और सभी प्रारंभिक कार्य ऑब्जेक्ट कन्स्ट्रक्टर में डाल दिया जाता है।
एक पुनरावर्ती एल्गोरिथ्म तभी सही समाधान होगा जब वह काम करेगाबाहरी नियंत्रण और प्रबंधन के बिना केवल स्वयं के द्वारा। एक बाहरी एल्गोरिथम केवल काम करने का संकेत दे सकता है। इस कार्य का परिणाम अपेक्षित समाधान होना चाहिए, बिना बाहरी सहयोग के।
पुनरावृत्ति हमेशा एक पूर्ण स्टैंड-अलोन समाधान होना चाहिए।
सहज समझ और कार्यात्मक पूर्णता
जब वस्तु-उन्मुख प्रोग्रामिंग वास्तविक मानक बन गई, तो यह स्पष्ट हो गया कि प्रभावी ढंग से कोड करने के लिए, आपको अपनी सोच बदलने की आवश्यकता है। एल्गोरिथम के निष्पादन के दौरान प्रोग्रामर को भाषा के वाक्य-विन्यास और शब्दार्थ से शब्दार्थ की गतिशीलता की ओर बढ़ना चाहिए।
पुनरावृत्ति की विशेषता: इसे हर चीज पर लागू किया जा सकता है:
- वेब स्क्रैपिंग;
- खोज अभियान;
- पाठ जानकारी पार्स करना;
- एमएस वर्ड दस्तावेज़ पढ़ना या बनाना;
- टैग का नमूना लेना या उनका विश्लेषण करना…
ओओपी की विशेषता: यह एक अमूर्त पूर्वज के स्तर पर एक पुनरावर्ती एल्गोरिदम का वर्णन करना संभव बनाता है, लेकिन इसे अद्वितीय वंशजों को संदर्भित करने के लिए प्रदान करता है, जिनमें से प्रत्येक के पास डेटा और गुणों का अपना पैलेट होता है।
Recursion आदर्श है क्योंकि इसके लिए इसके एल्गोरिथम की कार्यात्मक पूर्णता की आवश्यकता होती है। OOP एक पुनरावर्ती एल्गोरिथम के प्रदर्शन को सभी अद्वितीय बच्चों तक पहुँच प्रदान करके बेहतर बनाता है।