(पायथन) सबरूटीन्स। प्रत्यावर्तन


<टीडी> def क्रमगुणित (एन): अगर एन > 1: रिटर्न एन * फैक्टोरियल (एन - 1) अन्य:   वापसी 1 <टीडी> एक्स = 1 मैं सीमा में (1, एन + 1) के लिए: एक्स = एक्स * मैं;
यह समझा जाना चाहिए कि फ़ंक्शन कॉल में कुछ अतिरिक्त ओवरहेड शामिल होते हैं, इसलिए एक गैर-पुनरावर्ती फैक्टोरियल गणना थोड़ी तेज़ होगी। 

निष्कर्ष:
जहां आप एक सरल पुनरावृत्ति एल्गोरिथ्म के साथ एक कार्यक्रम लिख सकते हैं, बिना पुनरावर्तन के, तो आपको बिना पुनरावर्तन के लिखने की आवश्यकता है। लेकिन फिर भी, समस्याओं का एक बड़ा वर्ग है जहाँ कम्प्यूटेशनल प्रक्रिया केवल पुनरावर्तन द्वारा कार्यान्वित की जाती है।
दूसरी ओर, पुनरावर्ती एल्गोरिदम अक्सर अधिक समझने योग्य होते हैं।
 

रिकर्सन

एक प्रक्रिया या कार्य में इसके भीतर दूसरी प्रक्रिया के लिए कॉल हो सकती है। समेत, सबरूटीन खुद को कॉल कर सकता है। इस मामले में, कंप्यूटर परवाह नहीं करता। साथ ही, हमेशा की तरह, वह उन आदेशों को लगातार निष्पादित करता है जो उसे ऊपर से नीचे तक मिलते हैं।

अगर आपको गणित याद है, तो आप गणितीय आगमन के सिद्धांत से मिल सकते हैं। यह इस प्रकार है:
प्रत्येक प्राकृतिक n if
के लिए कुछ कथन सत्य है     1. यह n = 1 और
के लिए मान्य है     2. किसी भी मनमाना प्राकृतिक n = k के लिए कथन की वैधता से यह इस प्रकार है कि यह n = k + 1.
के लिए सत्य है
प्रोग्रामिंग में, इस तकनीक को पुनरावृत्ति
कहा जाता है  
रिकर्सन दिए गए सेट के आधार पर ऑब्जेक्ट के सेट को परिभाषित करने का एक तरीका है सरल आधार मामले।

रिकर्सिव एक प्रक्रिया (फ़ंक्शन) है जो स्वयं को सीधे या अन्य प्रक्रियाओं और कार्यों के माध्यम से कॉल करता है।
 
उदाहरण
<पूर्व> <कोड> डीईएफ़ आरईसी (ए): अगर (ए एंड जीटी; 0): आरईसी (ए -1) प्रिंट (ए)
आरेखीय रूप से, पुनरावर्तन के कार्य को फ़्लोचार्ट द्वारा प्रदर्शित किया जा सकता है



Rec() प्रक्रिया को पैरामीटर 3 के साथ निष्पादित किया जाता है। फिर, पैरामीटर 3 के साथ प्रक्रिया के अंदर, पैरामीटर 2 के साथ प्रक्रिया को कॉल किया जाता है, और इसी तरह, जब तक पैरामीटर 0 वाली प्रक्रिया को कॉल नहीं किया जाता है। जब पैरामीटर 0 वाली प्रक्रिया को कॉल किया जाता है, पुनरावर्ती कॉल अब नहीं होगी और पैरामीटर 0 वाली प्रक्रिया संख्या 0 को प्रिंट करेगी और बाहर निकल जाएगी। फिर नियंत्रण को पैरामीटर 1 के साथ प्रक्रिया में वापस स्थानांतरित कर दिया जाता है, यह नंबर 1 को प्रिंट करके अपना काम भी पूरा करता है, और इसी तरह। पैरामीटर 3 के साथ प्रक्रिया से पहले। 

जब तक वे अपना काम पूरा नहीं कर लेते, तब तक सभी प्रक्रियाओं को स्मृति में संग्रहीत किया जाता है। समवर्ती प्रक्रियाओं की संख्या को रिकर्सन डेप्थ कहा जाता है।
 

लूप रिप्लेसमेंट के रूप में रिकर्सन

हमने देखा है कि पुनरावर्तन एक उपनेमका में निहित निर्देशों का बार-बार निष्पादन है। और यह बदले में चक्र के कार्य के समान है। ऐसी प्रोग्रामिंग लैंग्वेज हैं जिनमें लूप कंस्ट्रक्शन पूरी तरह से अनुपस्थित है। उदाहरण के लिए, प्रोलॉग। 
for
लूप के काम को सिम्युलेट करने की कोशिश करते हैं for लूप में एक स्टेप काउंटर वेरिएबल होता है। एक पुनरावर्ती उपनेमका में, ऐसे चर को एक पैरामीटर के रूप में पारित किया जा सकता है। <पूर्व> # प्रक्रिया लूपइमिटेशन () दो मापदंडों के साथ # पहला पैरामीटर – स्टेप काउंटर, दूसरा पैरामीटर - चरणों की कुल संख्या def लूप इमिटेशन (i, n): प्रिंट ("हैलो एन", i) # कथन i के किसी भी मूल्य के लिए दोहराया जाना है अगर मैं < n: # जब तक लूप काउंटर मान n के बराबर न हो जाए, लूपइमिटेशन (i + 1, n) # प्रक्रिया का एक नया उदाहरण कॉल करें, # पैरामीटर i+1 के साथ (अगले मान i पर जाएं)

रिकर्सन और पुनरावृत्ति
रिकर्सन को समझने के लिए, आपको रिकर्सन को समझने की जरूरत है...
 
पुनरावृति प्रोग्रामिंग में - एक चरणचक्रीय डेटा संसाधन प्रक्रिया का। 
वर्तमान चरण (पुनरावृत्ति) पर अक्सर पुनरावृत्त एल्गोरिदम पिछले चरणों में गणना किए गए समान ऑपरेशन या क्रिया के परिणाम का उपयोग करते हैं।  ऐसी गणनाओं का एक उदाहरण पुनरावृत्ति संबंधों की गणना है। 
पुनरावर्ती मान का एक सरल उदाहरण भाज्य है: \(N!=1 \cdot 2 \cdot 3 \cdot \ ... \ \cdot N\)
प्रत्येक चरण (पुनरावृत्ति) पर मूल्य की गणना \(N=N \cdot i\) है।  \(N\) के मान की गणना करते समय, हम पहले से संग्रहीत मान लेते हैं \(N\)।< बीआर />
किसी संख्या के क्रमगुणन को पुनरावर्ती सूत्र:
का उपयोग करके भी वर्णित किया जा सकता है \(\begin{equation*} n!= \begin{cases} 1 &\text{n <= 1,}\\ (n-1)! \cdot n &\text{n > 1.} \end{cases} \end{equation*}\)

आप देख सकते हैं कि यह विवरण एक पुनरावर्ती क्रिया से अधिक कुछ नहीं है।
यहां पहली लाइन (\(n <= 1\)) बेस केस (रिकर्सन टर्मिनेशन कंडीशन) है और दूसरी लाइन अगले स्टेप के लिए ट्रांजिशन है।   <टेबल क्लास = "टेबल-एसएम टेबल-बॉर्डर टेबल-स्ट्राइप्ड टेबल-लिस्ट-टेस्ट"> <शरीर>
रिकर्सिव फैक्टोरियल फंक्शन पुनरावृत्ति एल्गोरिद्म
कार्य
जनजाति की भाषा की वर्णमाला में «तुम्बा-युम्बा» चार अक्षर: "के", "एल", "एम" और "एन". स्क्रीन पर एन अक्षर वाले सभी शब्दों को प्रदर्शित करना जरूरी है जो इस वर्णमाला के अक्षरों से बनाया जा सकता है

समस्या एक सामान्य क्रूर-बल समस्या है जिसे एक छोटी समस्या में कम किया जा सकता है।
हम शब्द के लिए अक्षरों को क्रमिक रूप से प्रतिस्थापित करेंगे।
किसी शब्द की पहली स्थिति वर्णमाला के 4 अक्षरों (K, L, M, N) में से एक हो सकती है।
सबसे पहले 'K' अक्षर को पहले रखें। फिर, पहले अक्षर 'K' वाले सभी प्रकार प्राप्त करने के लिए, आपको शेष n-1 स्थिति और .etc। (तस्वीर देखने)
इस प्रकार, हम एक पुनरावर्ती समाधान के साथ आए: एक लूप में, सभी संभावित पहले अक्षरों से गुजरें (वर्णमाला के प्रत्येक अक्षर को पहले स्थान पर रखें) और प्रत्येक मामले के लिए सभी संभव "पूंछ" बनाएं; लंबाई n-1
 
वर्णों का पुनरावर्ती पुनरावृत्ति
जब शेष भाग खाली हो (n = 0), यानी आपको रिकर्सन को रोकना होगा और समाप्त शब्द को आउटपुट करना होगा। सभी अक्षर पहले से ही चयनित हैं। 
पुनरावर्ती प्रक्रिया इस तरह दिखेगी:  <पूर्व> def TumbaWords(शब्द, अक्षर, n): अगर एन < 1: प्रिंट (शब्द) वापस करना सी के लिए वर्णमाला में: TumbaWords(शब्द+c, अक्षर, n - 1)