सादे अंग्रेजी में, पुनरावृत्ति क्या है?


74

वास्तविक दुनिया में पुनरावृत्ति का विचार बहुत आम नहीं है। तो, यह नौसिखिया प्रोग्रामर के लिए थोड़ा भ्रमित लगता है। हालांकि, मुझे लगता है, वे धीरे-धीरे अवधारणा के अभ्यस्त हो जाते हैं। तो, विचार को आसानी से समझने के लिए उनके लिए एक अच्छी व्याख्या क्या हो सकती है?


इस विषय पर संसाधन के
केनेथ

38
इसे भी देखें: programmers.stackexchange.com/questions/25052/…
compman

1
पुनरावृत्ति तब होती है जब कोई फ़ंक्शन स्वयं को कॉल कर सकता है। "यदि आप पूरी तरह से नाम स्थान और दायरे को समझते हैं और किसी फ़ंक्शन को कैसे पैरामीटर पास किया जाता है, तो आप पहले से ही पुनरावर्तन जानते हैं। मैं उदाहरण दिखा सकता हूं, लेकिन आपको यह पता लगाने में सक्षम होना चाहिए कि वे अपने आप कैसे काम करते हैं।" छात्र आम तौर पर पुनरावृत्ति के साथ संघर्ष करते हैं क्योंकि यह भ्रमित करने वाला नहीं है, लेकिन क्योंकि उनके पास चर गुंजाइश / नाम स्थान की एक फर्म पकड़ नहीं है। पुनरावृत्ति में गोता लगाने से पहले, सुनिश्चित करें कि छात्रों को एक कार्यक्रम के माध्यम से ठीक से पता लगा सकते हैं जहां आपने विभिन्न स्कोपों ​​में जानबूझकर दिए गए चर उन्हें भ्रमित करने के लिए एक ही नाम दिया है।
dspyz


1
रिकर्सन को समझने के लिए, आपको पहले
रिकर्सियन

जवाबों:


110

पुनरावर्तन की व्याख्या करने के लिए , मैं विभिन्न स्पष्टीकरण के संयोजन का उपयोग करता हूं, आमतौर पर दोनों की कोशिश करते हैं:

  • अवधारणा की व्याख्या करें,
  • यह समझाएं कि यह क्यों मायने रखता है,
  • इसे पाने का तरीका बताएं।

शुरुआत के लिए, वुल्फराम | अल्फा इसे विकिपीडिया की तुलना में अधिक सरल शब्दों में परिभाषित करता है :

एक अभिव्यक्ति जैसे कि प्रत्येक शब्द एक विशेष गणितीय ऑपरेशन को दोहराकर उत्पन्न होता है।


गणित

यदि आपका छात्र (या आप जिस व्यक्ति को भी समझाते हैं, अब से मैं छात्र कहूंगा) की कम से कम कुछ गणितीय पृष्ठभूमि है, तो उन्होंने स्पष्ट रूप से श्रृंखला का अध्ययन करके पुनरावृत्ति और उनके पुनरावृत्ति की धारणा और उनके पुनरावृत्ति संबंध का सामना किया है ।

शुरू करने का एक बहुत अच्छा तरीका एक श्रृंखला के साथ प्रदर्शित करना है और यह बताना है कि यह काफी सरलता से है।

  • एक गणितीय समारोह ...
  • ... जो स्वयं को n- वें तत्व के अनुरूप मान की गणना करने के लिए कहता है ...
  • ... और जो कुछ सीमाओं को परिभाषित करता है।

आमतौर पर, आप या तो "हुह, व्हाट" को सबसे अच्छे से प्राप्त करते हैं क्योंकि वे अभी भी इसका उपयोग नहीं करते हैं, या अधिक संभावना सिर्फ एक बहुत ही गहरे खर्राटे की है।


कोडिंग उदाहरण

बाकी के लिए, यह वास्तव में मैं क्या में प्रस्तुत की एक विस्तृत संस्करण है परिशिष्ट का मेरा उत्तर के लिए प्रश्न आप के बारे में संकेत दिए गए की ओर इशारा किया (बुरा यमक)।

इस स्तर पर, मेरे छात्र आमतौर पर जानते हैं कि स्क्रीन पर कुछ कैसे प्रिंट किया जाए। यह मानते हुए कि हम C का उपयोग कर रहे हैं, वे जानते हैं कि कैसे एक चार चार्ट का उपयोग करके प्रिंट करना है writeया printf। वे नियंत्रण छोरों के बारे में भी जानते हैं।

मैं आमतौर पर कुछ दोहराव और सरल प्रोग्रामिंग समस्याओं का सहारा लेता हूं जब तक कि वे इसे प्राप्त न करें:

  • भाज्य आपरेशन,
  • एक वर्णमाला प्रिंटर,
  • एक उल्टा वर्णमाला प्रिंटर,
  • exponentation आपरेशन।

कारख़ाने का

फैक्टरियल समझने के लिए एक बहुत ही सरल गणित अवधारणा है, और कार्यान्वयन इसके गणितीय प्रतिनिधित्व के बहुत करीब है। हालाँकि, वे इसे पहले नहीं प्राप्त कर सकते हैं।

फैक्टरियल ऑपरेशन की पुनरावर्ती परिभाषा

अक्षर

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

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

घातांक

घातांक समस्या थोड़ी अधिक कठिन है ( सीखने के इस चरण में)। जाहिर है कि अवधारणा वास्तव में एक फैक्टरियल के समान है और इसमें कोई जोड़ा जटिलता नहीं है ... सिवाय इसके कि आपके पास कई पैरामीटर हैं। और यह आमतौर पर लोगों को भ्रमित करने और शुरुआत में उन्हें फेंकने के लिए पर्याप्त है।

इसका सरल रूप:

घातांक ऑपरेशन का सरल रूप

पुनरावृत्ति द्वारा इस तरह व्यक्त किया जा सकता है:

प्रतिक्षेपण ऑपरेशन के लिए पुनरावृत्ति संबंध

और जोर से

एक बार इन सरल समस्याओं को दिखाया गया है और ट्यूटोरियल में फिर से लागू किया गया है, तो आप थोड़ा और अधिक कठिन (लेकिन बहुत क्लासिक) अभ्यास दे सकते हैं:

नोट: फिर से, इनमें से कुछ वास्तव में कोई कठिन नहीं हैं ... वे समस्या को बिल्कुल उसी कोण से या थोड़े अलग तरीके से देखते हैं। लेकिन अभ्यास परिपूर्ण बनाता है।


सहायकों

संदर्भ

कुछ पढ़ने में कभी दर्द नहीं होता। खैर यह पहली बार में होगा, और वे और भी अधिक खो दिया महसूस करेंगे। यह उस तरह की चीज है जो आप पर बढ़ती है और जो आपके सिर के पीछे एक दिन तक बैठती है जब तक कि आपका एहसास नहीं हो जाता है कि आप अंततः इसे प्राप्त करते हैं। और फिर आप इन सामानों को वापस पढ़ते हैं। प्रत्यावर्तन , प्रत्यावर्तन कंप्यूटर विज्ञान में और आवर्ती संबंध पृष्ठों विकिपीडिया पर अब के लिए करना होगा।

स्तर / गहराई

यह मानते हुए कि आपके छात्रों के पास कोडिंग का अधिक अनुभव नहीं है, कोड स्टब्स प्रदान करें। पहले प्रयासों के बाद, उन्हें एक मुद्रण कार्य दें जो पुनरावृत्ति स्तर प्रदर्शित कर सकता है। स्तर के संख्यात्मक मूल्य को प्रिंट करने से मदद मिलती है।

स्टैक-के रूप में दराज आरेख

मुद्रित परिणाम (या स्तर के आउटपुट) को इंडेंट करने में भी मदद मिलती है, क्योंकि यह एक अन्य विज़ुअल प्रतिनिधित्व देता है कि आपका प्रोग्राम क्या कर रहा है, फ़ाइल सिस्टम एक्सप्लोरर में फ़ोल्डर या फ़ोल्डर जैसे स्टैक संदर्भों को खोलना और बंद करना।

पुनरावर्ती

यदि आपका छात्र पहले से ही कंप्यूटर कल्चर में निपुण है, तो वे पहले से ही कुछ प्रोजेक्ट्स / सॉफ्टवेयर्स का उपयोग कर सकते हैं जिनके नाम पुनरावर्ती शब्दकोषों का उपयोग कर रहे हैं । यह कुछ समय से चली आ रही परंपरा है, खासकर GNU परियोजनाओं में। कुछ उदाहरणों में शामिल हैं:

पुनरावर्ती:

  • GNU - "GNU का यूनिक्स नहीं"
  • नागियोस - "नागिन ने गौना जोर नहीं दिया"
  • PHP - "PHP हाइपरटेक्स्ट प्रीप्रोसेसर" (और "पर्सनल होम पेज")
  • शराब - "शराब एक एमुलेटर नहीं है"
  • Zile - "Zile is Lossy Emacs"

पारस्परिक रूप से पुनरावर्ती:

  • HURD - "यूनिक्स-रिप्लेसमेंट डेमोंस" (जहाँ HIRD "गहराई का प्रतिनिधित्व करने वाले इंटरफेस" है)

क्या वे अपने साथ आने की कोशिश करते हैं।

इसी तरह, पुनरावर्ती हास्य की कई घटनाएं होती हैं, जैसे Google का पुनरावर्ती खोज सुधार। पुनरावर्तन के बारे में अधिक जानकारी के लिए, इस उत्तर को पढ़ें


नुकसान और आगे की सीख

कुछ मुद्दे जो लोग आम तौर पर संघर्ष करते हैं और जिसके लिए आपको जवाब जानने की आवश्यकता होती है।

क्यों, हे भगवान क्यों ???

तुम ऐसा क्यों करोगे? एक अच्छा लेकिन गैर-स्पष्ट कारण यह है कि इस तरह से किसी समस्या को व्यक्त करना अक्सर सरल होता है। एक नहीं-तो-अच्छा, लेकिन स्पष्ट कारण यह है कि यह अक्सर कम टाइपिंग लेता है (उन्हें केवल पुनरावृत्ति का उपयोग करने के लिए soooo l33t महसूस नहीं करते हैं ...)।

पुनरावर्ती दृष्टिकोण का उपयोग करते समय कुछ समस्याएं निश्चित रूप से हल करना आसान है। आमतौर पर, किसी भी समस्या को आप डिवाइड और कॉनकर प्रतिमान का उपयोग करके हल कर सकते हैं, एक बहु-शाखा पुनरावर्तन एल्गोरिथ्म फिट होगा।

फिर से एन क्या है ??

nहर बार मेरा या (आपके चर का नाम) अलग-अलग क्यों है ? शुरुआती को आमतौर पर यह समझने में समस्या होती है कि एक चर और पैरामीटर क्या हैं, और nआपके प्रोग्राम में नामित चीजों के अलग-अलग मूल्य कैसे हो सकते हैं। तो अब अगर यह मान नियंत्रण पाश या पुनरावृत्ति में है, तो यह और भी बुरा है! अच्छे रहें और हर जगह एक ही चर नाम का उपयोग न करें, और यह स्पष्ट करें कि पैरामीटर बस चर हैं

अंतिम शर्तें

मैं अपनी अंतिम स्थिति कैसे निर्धारित करूं? यह आसान है, बस उन्हें जोर से कदम कहना है। इस तथ्य के लिए उदाहरण के लिए 5 से शुरू, फिर 4, फिर ... 0 तक।

शैतान विवरण में है

टेल कॉल ऑप्टिमाइजेशन जैसी शुरुआती अशिष्ट चीजों से बात न करें । मुझे पता है, मुझे पता है, TCO अच्छा है, लेकिन वे पहले से परवाह नहीं करते हैं। उन्हें प्रक्रिया के आसपास अपने सिर को इस तरह से लपेटने के लिए कुछ समय दें जो उनके लिए काम करता है। बेझिझक बाद में फिर से उनकी दुनिया बिखरें, लेकिन उन्हें एक विराम दें।

इसी तरह, कॉल स्टैक और इसकी मेमोरी खपत और ... अच्छी तरह से ... स्टैक ओवरफ्लो के बारे में पहले व्याख्यान से सीधे बात न करें । मैं अक्सर निजी तौर पर छात्रों को पढ़ाता हूं जो मुझे व्याख्यान दिखाते हैं जहां उनके पास हर चीज के बारे में 50 स्लाइड हैं पुनरावृत्ति के बारे में जानने के लिए जब वे मुश्किल से इस चरण में सही ढंग से एक लूप लिख सकते हैं। यह एक अच्छा उदाहरण है कि कैसे एक संदर्भ बाद में मदद करेगा लेकिन अभी आपको गहराई से भ्रमित करता है

लेकिन कृपया, नियत समय में, यह स्पष्ट कर दें कि पुनरावृत्ति या पुनरावर्ती मार्ग जाने के कारण हैं

परस्पर पुनरावृत्ति

हमने देखा है कि फ़ंक्शन पुनरावर्ती हो सकते हैं, और यहां तक ​​कि उनके पास कई कॉल पॉइंट (8-क्वीन्स, हनोई, फाइबोनैचि या यहां तक ​​कि एक माइन्सवीपर के लिए एक अन्वेषण एल्गोरिथ्म) हो सकते हैं। लेकिन पारस्परिक रूप से पुनरावर्ती कॉल के बारे में क्या ? यहां भी गणित से शुरू करें। f(x) = g(x) + h(x)कहाँ g(x) = f(x) + l(x)और सिर्फ hऔर lसिर्फ सामान।

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

हॉफ़स्टैटर के पुरुष और महिला अनुक्रम

हालांकि कोड के संदर्भ में, यह ध्यान दिया जाना चाहिए कि पारस्परिक रूप से पुनरावर्ती समाधान के कार्यान्वयन से अक्सर कोड दोहराव होता है और इसे एक ही पुनरावर्ती रूप में सुव्यवस्थित किया जाना चाहिए (देखें पीटर नॉरविग की हर सुडोकू पहेली को हल करते हुए


5
मैं लगभग 5 वीं या 6 वीं बार देखने के बाद आपका जवाब पढ़ रहा हूं। यह अच्छा था लेकिन मुझे लगता है कि अन्य उपयोगकर्ताओं को आकर्षित करने के लिए बहुत लंबा है। मैंने यहाँ पुनरावृत्ति सिखाने के बारे में कई बातें सीखीं। एक शिक्षक के रूप में, क्या आप पुनरावर्तन सिखाने के लिए मेरे विचार का मूल्यांकन करेंगे- प्रोग्रामर.स्टैकएक्सचेंज.
गुलशन

9
@ गुलशन, मुझे लगता है कि यह उत्तर उतना ही व्यापक है जितना कि कोई भी हो सकता है और एक आकस्मिक पाठक द्वारा आसानी से 'स्किम्ड' हो जाता है। इसलिए, यह static unsigned int vote = 1;मुझसे मिलता है। स्थिर हास्य को क्षमा करें, अगर आप करेंगे :) यह अब तक का सबसे अच्छा जवाब है।
टिम पोस्ट

1
@ गुलशन: केवल वही जो सीखना चाहता है वह ठीक से समय लेने के लिए तैयार है :) मैं वास्तव में बुरा नहीं मानता। कभी-कभी, एक संक्षिप्त उत्तर सुरुचिपूर्ण होता है और सामान्य अवधारणा को समझाने या समझाने के लिए बहुत उपयोगी और आवश्यक जानकारी प्रदान करता है। मैं सिर्फ उस एक के लिए एक लंबा जवाब चाहता था, और ओपी ने एक प्रश्न का उल्लेख करते हुए कहा कि जिसके लिए मुझे "सही" उत्तर दिया गया था और एक समान प्रश्न पूछता है, मैंने उसी तरह के उत्तर देने के लिए उचित संघर्ष किया। खुशी है कि आपने कुछ सीखा।
१०:१०

@ गुलशन: अब आपके जवाब के बारे में: पहले बिंदु ने मुझे बहुत उलझन में डाल दिया, मुझे कहना होगा। मुझे यह पसंद है कि आप समय के साथ-साथ पुनरावर्ती कार्यों की अवधारणा का वर्णन करते हैं जो समय के साथ-साथ बढ़ती है, लेकिन मुझे लगता है कि आपके पेश करने का तरीका थोड़ा अजीब है। आपके 3 अंक पढ़ने के बाद, मुझे उम्मीद नहीं होगी कि कई छात्र अचानक हनोई को हल करने में सक्षम होंगे। लेकिन यह सिर्फ एक मुद्दा हो सकता है।
१०:१०

मैं यह दिखाने के अच्छे तरीके से आया हूं कि एक ही चर में पुनरावृत्ति की अलग-अलग गहराई में अलग-अलग मूल्य हो सकते हैं: कुछ पुनरावर्ती कोड का पालन करने में छात्रों को उनके द्वारा उठाए जा रहे कदम, और चर के मूल्यों को लिखने पर विचार करें। जब वे एक पुनरावृत्ति तक पहुँचते हैं, तो क्या वे फिर से एक नए टुकड़े पर शुरू होते हैं। एक बार जब वे बाहर निकलने की स्थिति में पहुंच जाते हैं, तो उन्हें पिछले टुकड़े पर वापस ले जाएं। यह अनिवार्य रूप से कॉल स्टैक का अनुकरण कर रहा है, लेकिन यह इन अंतरों को दिखाने का एक अच्छा तरीका है।
एंडी हंट

58

उसी फ़ंक्शन के भीतर से किसी फ़ंक्शन की कॉलिंग।


2
यह वास्तव में शुरू करने के लिए सबसे अच्छा स्पष्टीकरण है। सरल और सटीक; एक बार जब आप इस सारांश को स्थापित कर लेते हैं, तो सभी हेड-ट्रिप विवरण में जाते हैं।
झूल

27

रिकर्सियन एक फ़ंक्शन है जो स्वयं को कॉल करता है।

इसका उपयोग कैसे करें, इसका उपयोग कब करें और खराब डिज़ाइन से कैसे बचें, यह जानना महत्वपूर्ण है, जिसके लिए आपको इसे अपने लिए आज़माना होगा, और समझें कि क्या होता है।

सबसे महत्वपूर्ण बात जो आपको जानना आवश्यक है वह यह है कि लूप को समाप्त न करने के लिए बहुत सावधानी बरतनी चाहिए। आपके प्रश्न का pramodc84 से उत्तर में यह दोष है: यह कभी समाप्त नहीं होता है ...
एक पुनरावर्ती फ़ंक्शन को हमेशा यह निर्धारित करने के लिए एक शर्त की जांच करनी चाहिए कि क्या उसे फिर से कॉल करना चाहिए या नहीं।

पुनरावर्तन का उपयोग करने के लिए सबसे क्लासिक उदाहरण, एक पेड़ के साथ काम करना है जिसमें गहराई में कोई स्थिर सीमा नहीं है। यह एक कार्य है जिसे आपको पुनरावर्तन का उपयोग करना चाहिए।


आप अभी भी अपने अंतिम पैराग्राफ को एक पुनरावृत्त तरीके से लागू कर सकते हैं, हालांकि पुनरावृत्ति जाहिर तौर पर बेहतर होगी। "इसका उपयोग कैसे करें, इसका उपयोग कब करें और खराब डिज़ाइन से कैसे बचें, यह जानना महत्वपूर्ण है, जिसके लिए आपको इसे अपने लिए आज़माने की आवश्यकता है, और समझें कि क्या होता है।" मुझे लगा कि प्रश्न का बिंदु इसके लिए स्पष्टीकरण प्राप्त करना था। इस तरह की बातें।
15

@ बाल शैली: आप उस उत्तर के बारे में सही हैं कि "इसका उपयोग कैसे करें, इसका उपयोग कब करें और खराब डिज़ाइन से कैसे बचें .." स्पॉट पर अधिक होगा जो ओपी पूछता है (न सिर्फ "इसे अपने लिए आज़माएं" "जैसा कि मैंने कहा), लेकिन यहां एक प्रश्न के त्वरित उत्तर के बजाय अधिक शिक्षण प्रकार के व्यापक व्याख्यान की आवश्यकता होगी। आपने अपने जवाब के साथ बहुत अच्छा काम किया है । इसके लिए +1 ... जिन लोगों को वास्तव में अवधारणा की बेहतर समझ प्राप्त करने की आवश्यकता है, उन्हें आपके उत्तर को पढ़ने से लाभ होगा।
विस्मयकारी

एक दूसरे को कॉल करने वाले कार्यों की एक जोड़ी के बारे में क्या। A कॉल B जो किसी स्थिति तक पहुँचने के लिए A को फिर से कॉल करता है। क्या इसे अभी भी पुनरावृत्ति माना जाएगा?
santiagozky

हां, फ़ंक्शन aअभी भी खुद को कॉल करता है, बस अप्रत्यक्ष रूप से (कॉल करके b)।
टाइप करें

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

21

पुनरावर्ती प्रोग्रामिंग स्वयं के संस्करणों को हल करने के लिए एक समस्या को उत्तरोत्तर कम करने की प्रक्रिया है।

प्रत्येक पुनरावर्ती फ़ंक्शन निम्न में शामिल है:

  1. प्रक्रिया, या कुछ अन्य संरचना, या समस्या डोमेन के लिए एक सूची लें
  2. वर्तमान बिंदु / चरण से निपटें
  3. शेष (ओं) / उपडोमेन (ओं) पर कॉल करें
  4. उपडोमेन कार्य के परिणामों को संयोजित या उपयोग करें

जब चरण 2 3 से पहले होता है, और जब चरण 4 तुच्छ होता है (एक संघटन, योग, या कुछ भी नहीं) यह पूंछ की सरगर्मी को सक्षम करता है । चरण 2 को अक्सर चरण 3 के बाद आना चाहिए, क्योंकि वर्तमान चरण को पूरा करने के लिए समस्या के उपडोमेन (ओं) से परिणाम की आवश्यकता हो सकती है।

एक सीधे आगे बाइनरी ट्री का ट्रैवर्सल लें। ट्रैवर्सल पूर्व-क्रम, इन-ऑर्डर या पोस्ट-ऑर्डर में बनाया जा सकता है, जो आवश्यक है, उसके आधार पर।

   B
A     C

प्री-ऑर्डर: बीएसी

traverse(tree):
    visit the node
    traverse(left)
    traverse(right)

इन-ऑर्डर: एबीसी

traverse(tree):
    traverse(left)
    visit the node
    traverse(right)

पोस्ट-ऑर्डर: एसीबी

traverse(tree):
    traverse(left)
    traverse(right)
    visit the node

बहुत से पुनरावर्ती समस्याएँ मानचित्र संचालन के विशिष्ट मामले हैं , या एक मोड़ - बस इन दो कार्यों को समझने से पुनरावृत्ति के लिए अच्छे उपयोग के मामलों की महत्वपूर्ण समझ हो सकती है।


व्यावहारिक पुनरावृत्ति के लिए प्रमुख घटक एक बड़ी समस्या को हल करने के लिए थोड़ी छोटी समस्या के समाधान का उपयोग करने का विचार है। अन्यथा, आपके पास केवल अनंत पुनरावृत्ति है।
बैरी ब्राउन

@ बैरी ब्राउन: बिल्कुल सही। इसलिए मेरा कथन "... स्वयं के संस्करणों को हल करने के लिए आसान करने के लिए एक समस्या को कम करना"
परिक्रमा

मैं जरूरी नहीं कहूंगा ... यह अक्सर ऐसा होता है, विशेष रूप से विभाजित और समस्याओं पर विजय प्राप्त करने के लिए या उन स्थितियों के लिए जहां आप वास्तव में एक पुनरावृत्ति संबंध को परिभाषित करते हैं जो एक साधारण मामले में नीचे आता है। लेकिन मैं कहूंगा कि यह साबित करने के बारे में अधिक है कि आपकी समस्या के प्रत्येक पुनरावृत्ति एन के लिए, एक कम्प्यूटेशनल केस एन + 1 है
15

1
@ सीन मैकमिलन: रिकर्सियन एक शक्तिशाली उपकरण है जब इसे इस्तेमाल करने वाले डोमेन में उपयोग किया जाता है। सभी अक्सर मैं इसे कुछ अपेक्षाकृत तुच्छ मुद्दे को संभालने के लिए एक चतुर तरीके के रूप में इस्तेमाल करता हूं, जो बड़े पैमाने पर हाथ में कार्य की वास्तविक प्रकृति को बाधित करता है।
परिक्रमा

20

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

आइए, पिज्जा काटने की असली दुनिया का 'ऑपरेशन' करें। आपने पिज्जा को ओवन से बाहर निकाल लिया है और इसे परोसने के लिए आपको इसे आधा काटना है, फिर उन हिस्सों को आधा में काट लें, फिर उन आधे हिस्सों को फिर से काट लें।

आपके द्वारा बार-बार प्रदर्शन कर रहे पिज्जा को काटने का ऑपरेशन जब तक आपको वह परिणाम नहीं मिल जाता है जो आप चाहते हैं (स्लाइस की संख्या)। और तर्क के लिए मान लें कि एक कच्चा पिज्जा एक टुकड़ा है।

यहाँ एक उदाहरण है रूबी में:

def cut_pizza (मौजूदा_साल, वांछित_साल)
  अगर मौजूदा_सच्ची!
    # हमारे पास अभी तक सभी को खिलाने के लिए पर्याप्त स्लाइस नहीं हैं, इसलिए
    # हम पिज्जा स्लाइस काट रहे हैं, इस प्रकार उनकी संख्या दोगुनी कर रहे हैं
    new_slices = current_slices * 2 
    # और यह यहाँ पुनरावर्ती कॉल है
    cut_pizza (new_slices, वांछित_slices)
  अन्य
    # हमारे पास वांछित संख्या में स्लाइस हैं, इसलिए हम वापस लौट आए
    # यहां लगातार आने के बजाय
    मौजूदा_सामग्री लौटाएं
  समाप्त
समाप्त

पिज़्ज़ा = 1 # एक संपूर्ण पिज़्ज़ा, 'एक टुकड़ा'
cut_pizza (पिज़्ज़ा, 8) # => हम 8 प्राप्त करेंगे

तो असली दुनिया ऑपरेशन एक पिज्जा काट रहा है, और पुनरावृत्ति बार-बार एक ही काम कर रहा है जब तक कि आपके पास वह नहीं है जो आप चाहते हैं।

परिचालन आपको लगता है कि फसल आप पुनरावर्ती कार्यों के साथ लागू कर सकते हैं:

  • कई महीनों में चक्रवृद्धि ब्याज की गणना।
  • फ़ाइल सिस्टम पर फ़ाइल की तलाश में (क्योंकि फ़ाइल सिस्टम निर्देशिकाओं के कारण पेड़ हैं)।
  • कुछ भी जिसमें सामान्य रूप से पेड़ों के साथ काम करना शामिल है, मुझे लगता है।

मैं फ़ाइल नाम के आधार पर फ़ाइल देखने के लिए एक कार्यक्रम लिखने की सलाह देता हूं, और एक फ़ंक्शन लिखने की कोशिश करता हूं जो खुद को कॉल करता है जब तक कि यह नहीं मिलता है, हस्ताक्षर इस तरह दिखेगा:

find_file_by_name(file_name_we_are_looking_for, path_to_look_in)

तो आप इसे इस तरह कह सकते हैं:

find_file_by_name('httpd.conf', '/etc') # damn it i can never find apache's conf

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

अतिरिक्त क्रेडिटcut_pizza उपरोक्त उदाहरण यदि आप इसे स्लाइस के एक नंबर के लिए पूछना आप एक ढेर के स्तर का बहुत गहरा त्रुटि दे देंगे कि 2 (यानी 2 या 4 या 8 या 16) की एक शक्ति नहीं है। क्या आप इसे संशोधित कर सकते हैं कि अगर कोई 10 स्लाइस मांगता है तो यह हमेशा के लिए नहीं चलेगा?


16

ठीक है, मैं इसे सरल और संक्षिप्त रखने की कोशिश करने जा रहा हूं।

पुनरावर्ती कार्य ऐसे फ़ंक्शन हैं जो स्वयं को कॉल करते हैं। पुनरावर्ती कार्य तीन चीजों से मिलकर बनता है:

  1. तर्क
  2. खुद को एक कॉल
  3. कब समाप्त करें

पुनरावर्ती विधियों को लिखने के सर्वोत्तम तरीके, उस विधि के बारे में सोचना है जिसे आप एक सरल उदाहरण के रूप में लिखने की कोशिश कर रहे हैं, केवल उस प्रक्रिया के एक लूप को संभालना है जिसे आप फिर से लिखना चाहते हैं, फिर कॉल को विधि में जोड़ें, और जब आप चाहें तब जोड़ें समाप्त। सीखने का सबसे अच्छा तरीका सभी चीजों की तरह अभ्यास करना है।

चूंकि यह प्रोग्रामर की वेबसाइट है, इसलिए मैं लिखने के कोड से बचना चाहूंगा लेकिन यहां एक अच्छी कड़ी है

अगर आपको वह मज़ाक मिला है तो आपको पता चलेगा कि रिकर्सन का मतलब क्या है।


इस उत्तर को भी देखें: programmers.stackexchange.com/questions/25052/… (-:
Murph

4
सख्ती से, पुनरावृत्ति को समाप्ति की स्थिति की आवश्यकता नहीं है; यह सुनिश्चित करना कि पुनरावृत्ति समाप्त हो जाती है, उन समस्याओं के प्रकारों को सीमित करता है जो पुनरावर्ती कार्य हल कर सकते हैं, और कुछ प्रकार की अर्थपूर्ण प्रस्तुतियाँ हैं जिन्हें समाप्ति की आवश्यकता नहीं है।
डोनाल्ड फेलो

6

पुनरावर्तन एक उपकरण है जिसे एक प्रोग्रामर स्वयं पर एक फ़ंक्शन कॉल को आमंत्रित करने के लिए उपयोग कर सकता है। फाइबोनैचि अनुक्रम पाठ्यपुस्तक का उदाहरण है कि कैसे पुनरावृत्ति का उपयोग किया जाता है।

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

रिकर्सियन का उपयोग कोड को कम मैला करने के लिए किया जाता है, ध्यान रखें कि यह आमतौर पर धीमा होता है और अधिक मेमोरी की आवश्यकता होती है।


चाहे यह धीमा हो या अधिक मेमोरी की आवश्यकता हो, हाथ पर उपयोग पर निर्भर करता है।
परिक्रमा

5
रेशेदार अनुक्रम गणना पुनरावर्ती करने के लिए एक भयानक बात है। ट्री ट्रैवर्सल पुनरावृत्ति का अधिक प्राकृतिक उपयोग है। आमतौर पर, जब पुनरावृत्ति का अच्छी तरह से उपयोग किया जाता है, तो यह धीमा नहीं होता है और अधिक मेमोरी की आवश्यकता नहीं होती है, क्योंकि आपको कॉल स्टैक के बजाय अपने खुद के स्टैक को बनाए रखना होगा।
डेविड थॉर्नले

1
@ क्या: मैं उस पर विवाद नहीं करूंगा, लेकिन मुझे लगता है कि फिबोनाची के साथ शुरुआत करने के लिए एक अच्छा उदाहरण है।
ब्रायन हैरिंगटन

5

मुझे इसका उपयोग करना पसंद है:

आप स्टोर पर कैसे चलते हैं?

यदि आप स्टोर के प्रवेश द्वार पर हैं, तो बस इसके माध्यम से जाएं। अन्यथा, एक कदम उठाएं, फिर स्टोर के बाकी रास्ते पर चलें।

तीन पहलुओं को शामिल करना महत्वपूर्ण है:

  • एक तुच्छ आधार मामला
  • समस्या के एक छोटे से टुकड़े को हल करना
  • शेष समस्या को पुनरावृत्ति से हल करना

हम वास्तव में दैनिक जीवन में बहुत अधिक उपयोग करते हैं; हम सिर्फ इस तरह से नहीं सोचते हैं।


THAT पुनरावृत्ति नहीं है। यह होगा यदि आप इसे दो में विभाजित करते हैं: स्टोर में आधे रास्ते पर चलें, दूसरे आधे पर चलें। Recurse।

2
यह पुनरावृत्ति है। यह विभाजित और जीत नहीं है, लेकिन यह केवल एक प्रकार की पुनरावृत्ति है। ग्राफ एल्गोरिदम (पथ खोज की तरह) पुनरावर्ती अवधारणाओं से भरे हुए हैं।
डेडलिंक

2
यह पुनरावृत्ति है, लेकिन मैं इसे एक खराब उदाहरण मानता हूं, क्योंकि मानसिक रूप से अनुवाद करने में बहुत आसान है "एक कदम उठाएं, फिर बाकी रास्ते को स्टोर करें" पुनरावृत्त एल्गोरिथ्म में। मुझे ऐसा लगता है कि यह एक अच्छी तरह से लिखित forलूप को एक व्यर्थ पुनरावर्ती फ़ंक्शन में परिवर्तित करने के बराबर है ।
ब्रायन

3

सबसे अच्छा उदाहरण जो मैं आपको इंगित करूंगा वह है K & R द्वारा C प्रोग्रामिंग लैंग्वेज। उस किताब में (और मैं मेमोरी से उद्धृत कर रहा हूं), पुनरावृत्ति के लिए इंडेक्स पेज में प्रविष्टि (अकेले) वास्तविक पृष्ठ को सूचीबद्ध करता है जहां वे पुनरावृत्ति के बारे में बात करते हैं और इंडेक्स पेज भी।


2

जोश के ने पहले से ही मटरोशका गुड़िया का उल्लेख किया है । मान लें कि आप कुछ सीखना चाहते हैं जो केवल सबसे छोटी गुड़िया को पता है। समस्या यह है कि आप वास्तव में उससे सीधे बात नहीं कर सकते हैं, क्योंकि वह मूल रूप से लम्बी गुड़िया के अंदर रहती है जो पहली तस्वीर उसके बाईं ओर रखी गई है। यह संरचना उस तरह की हो जाती है (एक गुड़िया लंबी गुड़िया के अंदर रहती है) जब तक कि वह केवल सबसे ऊंची के साथ समाप्त न हो।

तो केवल एक चीज जो आप कर सकते हैं वह है कि आप अपने सवाल को सबसे लंबी गुड़िया से पूछें। सबसे लंबी गुड़िया (जिसका उत्तर नहीं पता है) को आपके प्रश्न को छोटी गुड़िया (जो पहली तस्वीर उसके दाईं ओर है) को पास करने की आवश्यकता होगी। चूंकि उसके पास यह जवाब नहीं है कि उसे अगली छोटी गुड़िया से क्या पूछना है। यह उस तरह से जाएगा जब तक संदेश सबसे छोटी गुड़िया तक नहीं पहुंचता। सबसे छोटी गुड़िया (जो गुप्त उत्तर जानने वाली एकमात्र है) अगली लम्बी गुड़िया (उसके बाईं ओर पाई गई) के उत्तर को पास करेगी, जो इसे अगली लम्बी गुड़िया को देगी ... और यह उत्तर आने तक जारी रहेगी अपनी अंतिम मंजिल तक पहुँचता है, जो सबसे लंबी गुड़िया है और अंत में ... आप :)

यह वही है जो वास्तव में पुनरावृत्ति करता है। एक फ़ंक्शन / विधि अपेक्षित जवाब मिलने तक खुद को कॉल करती है। इसीलिए जब आप पुनरावर्ती कोड लिखते हैं, तो यह तय करना बहुत महत्वपूर्ण है कि पुनरावृत्ति कब समाप्त होनी चाहिए।

सबसे अच्छा स्पष्टीकरण नहीं है, लेकिन यह उम्मीद है कि मदद करता है।


2

पुनरावर्तन n। - एल्गोरिथ्म डिजाइन का एक पैटर्न जहां एक ऑपरेशन खुद के संदर्भ में परिभाषित किया गया है।

क्लासिक उदाहरण एक संख्या के भाज्य का पता लगा रहा है, n !. 0! = 1, और किसी भी अन्य प्राकृतिक संख्या N के लिए, N का भाज्य N. So, 6 से कम या बराबर सभी प्राकृतिक संख्याओं का उत्पाद है! = 6 * 5 * 4 * 3 * 2 * 1 = 720. यह मूल परिभाषा आपको एक सरल पुनरावृत्त समाधान बनाने की अनुमति देगी:

int Fact(int degree)
{
    int result = 1;
    for(int i=degree; i>1; i--)
       result *= i;

    return result;
}

हालांकि, ऑपरेशन की फिर से जांच करें। 6! = 6 * 5 * 4 * 3 * 2 * 1। उसी परिभाषा से, 5! = ५ * ४ * ३ * २ * १, मतलब हम ६ कह सकते हैं! = 6 * (5!)। बदले में, 5! = ५ * (४!) इत्यादि। ऐसा करने से, हम सभी पिछले ऑपरेशनों के परिणाम पर किए गए एक ऑपरेशन के लिए समस्या को कम करते हैं। यह अंततः एक बिंदु तक कम हो जाता है, जिसे बेस केस कहा जाता है, जहां परिणाम को परिभाषा से जाना जाता है। हमारे मामले में, 0! = 1 (हम ज्यादातर मामलों में यह भी कह सकते हैं कि 1! = 1)। कंप्यूटिंग में, हम अक्सर एल्गोरिदम को बहुत ही समान तरीके से परिभाषित करने की अनुमति देते हैं, विधि कॉल करके और एक छोटा इनपुट पास करते हैं, इस प्रकार आधार मामले में कई पुनरावृत्ति के माध्यम से समस्या को कम करते हैं:

int Fact(int degree)
{
    if(degree==0) return 1; //the base case; 0! = 1 by definition
    else return degree * Fact(degree -1); //the recursive case; N! = N*(N-1)!
}

यह, कई भाषाओं में, टर्नरी ऑपरेटर का उपयोग करके और भी सरल किया जा सकता है (कभी-कभी भाषाओं में Iif फ़ंक्शन के रूप में देखा जाता है जो ऑपरेटर को इस तरह प्रदान नहीं करता है):

int Fact(int degree)
{
    //reads equivalently to the above, but is concise and often optimizable
    return degree==0 ? 1: degree * Fact(degree -1);
}

लाभ:

  • प्राकृतिक अभिव्यक्ति - कई प्रकार के एल्गोरिदम के लिए, यह फ़ंक्शन को व्यक्त करने का एक बहुत ही स्वाभाविक तरीका है।
  • कम LOC - किसी फ़ंक्शन को पुनरावर्ती रूप से परिभाषित करना अक्सर अधिक संक्षिप्त होता है।
  • गति - कुछ मामलों में, भाषा और कंप्यूटर वास्तुकला पर निर्भर करता है, एल्गोरिथ्म की पुनरावृत्ति समकक्ष पुनरावृत्ति समाधान की तुलना में तेजी से होती है, आमतौर पर क्योंकि फ़ंक्शन कॉल करना हार्डवेयर स्तर पर एक तेज संचालन होता है, जो ऑपरेशन और मेमोरी एक्सेस से पुनरावृत्ति के लिए आवश्यक होता है।
  • विभाज्यता - कई पुनरावर्ती एल्गोरिदम "मानसिकता को विभाजित और जीतते हैं"; ऑपरेशन का परिणाम इनपुट के दो हिस्सों में से प्रत्येक पर किए गए एक ही ऑपरेशन के परिणाम का एक कार्य है। यह आपको प्रत्येक स्तर पर दो में काम को विभाजित करने की अनुमति देता है, और यदि उपलब्ध हो तो आप प्रक्रिया के लिए दूसरे आधे को "निष्पादन इकाई" दे सकते हैं। यह पुनरावृत्त एल्गोरिथ्म के साथ आमतौर पर कठिन या असंभव है।

नुकसान:

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

1

मैं जिस उदाहरण का उपयोग करता हूं वह एक समस्या है जिसका मैंने वास्तविक जीवन में सामना किया है। आपके पास एक कंटेनर है (जैसे कि एक बड़ा बैग जिसे आप यात्रा पर ले जाना चाहते हैं) और आप कुल वजन जानना चाहते हैं। आपके पास कंटेनर में दो या तीन ढीली वस्तुएं हैं, और कुछ अन्य कंटेनर (कहते हैं, सामान की बोरियां।) कुल कंटेनर का वजन स्पष्ट रूप से खाली कंटेनर का वजन है और इसमें सब कुछ का वजन है। ढीली वस्तुओं के लिए, आप बस उन्हें तौलना कर सकते हैं, और सामान की बोरियों के लिए आप बस उन्हें तौलना कर सकते हैं या आप कह सकते हैं "अच्छी तरह से प्रत्येक सामान का वजन खाली कंटेनर का वजन है और इसमें सब कुछ का वजन है"। और फिर आप कंटेनर में कंटेनर में जा रहे हैं और इसी तरह जब तक आप एक बिंदु तक नहीं पहुंचते हैं जहां कंटेनर में बस ढीली चीजें होती हैं। वह पुनरावृत्ति है।

आप सोच सकते हैं कि वास्तविक जीवन में कभी ऐसा नहीं होता है, लेकिन कल्पना करें कि किसी विशेष कंपनी या मंडल के लोगों की तनख्वाह गिनने या जोड़ने की कोशिश की जाए, जिसमें ऐसे लोगों का मिश्रण होता है जो बस कंपनी के लिए काम करते हैं, लोग विभाजन में, फिर विभाग और इतने पर विभाग हैं। या ऐसे देश में बिक्री, जिसमें कुछ क्षेत्र हैं, जिनमें से कुछ उप-भाग हैं, आदि। इस प्रकार की समस्याएं व्यापार में हर समय होती हैं।


0

गणना का उपयोग बहुत सारी गिनती की समस्याओं को हल करने के लिए किया जा सकता है। उदाहरण के लिए, मान लें कि आपके पास एक पार्टी (n> 1) में n लोगों का एक समूह है, और हर कोई हर किसी के हाथ को एक बार हिलाता है। कितने हैंडशेक लगते हैं? आप जान सकते हैं कि समाधान C (n, 2) = n (n-1) / 2 है, लेकिन आप निम्न को हल कर सकते हैं:

मान लीजिए कि सिर्फ दो लोग हैं। तब (निरीक्षण द्वारा) उत्तर स्पष्ट रूप से 1 है।

मान लीजिए आपके पास तीन लोग हैं। एक व्यक्ति को बाहर करें, और ध्यान दें कि वह दो अन्य लोगों के साथ हाथ मिलाता है। उसके बाद आपको बाकी दो लोगों के बीच होने वाले हैंडशेक को गिनना होगा। हमने पहले से ही अभी-अभी किया है, और यह 1. है तो उत्तर 2 + 1 = 3 है।

मान लीजिए कि आपके पास n लोग हैं। पहले के समान तर्क का अनुसरण करते हुए, यह (n-1) + (n-1 लोगों के बीच हैंडशेक की संख्या) है। विस्तार करते हुए, हमें (n-1) + (n-2) + ... + 1 मिलता है।

एक पुनरावर्ती कार्य के रूप में व्यक्त किया गया,

f (2) = 1
f (n) = n-1 + f (n-1), n> 2


0

जीवन में (एक कंप्यूटर प्रोग्राम में विरोध के रूप में) पुनरावृत्ति शायद ही कभी हमारे सीधे नियंत्रण में होती है, क्योंकि ऐसा होने के लिए भ्रमित हो सकता है। इसके अलावा, धारणा कार्यात्मक रूप से शुद्ध होने के बजाय, दुष्प्रभाव के बारे में बताती है, इसलिए यदि पुनरावृत्ति हो रही है तो आप इसे नोटिस नहीं कर सकते हैं।

पुनरावृत्ति दुनिया में यहाँ हालांकि होता है। बहुत।

एक अच्छा उदाहरण जल चक्र का (एक सरलीकृत संस्करण) है:

  • सूरज झील को गर्म करता है
  • पानी आकाश में जाता है और बादलों का निर्माण करता है
  • बादल एक पहाड़ पर बहते हैं
  • पहाड़ पर हवा उनकी नमी बरकरार रखने के लिए बहुत ठंडी हो जाती है
  • बारिश
  • एक नदी बनती है
  • नदी का पानी झील में चला जाता है

यह एक ऐसा चक्र है जो इसके स्व को फिर से होने का कारण बनता है। यह पुनरावर्ती है।

एक और जगह आप पुनरावृत्ति प्राप्त कर सकते हैं अंग्रेजी में है (और सामान्य रूप से मानव भाषा)। आप इसे पहली बार में नहीं पहचान सकते हैं, लेकिन जिस तरह से हम एक वाक्य उत्पन्न कर सकते हैं वह पुनरावर्ती है, क्योंकि नियम हमें एक प्रतीक के एक उदाहरण को एक ही प्रतीक के दूसरे उदाहरण को एम्बेड करने की अनुमति देते हैं।

स्टीवन पिंकर की भाषा की वृत्ति से:

अगर या तो लड़की आइसक्रीम खाती है या लड़की कैंडी खाती है तो लड़का गर्म कुत्तों को खाता है

यह एक पूरा वाक्य है जिसमें अन्य पूरे वाक्य हैं:

लड़की आइसक्रीम खाती है

लड़की कैंडी खाती है

लड़का गर्म कुत्तों को खाता है

पूर्ण वाक्य को समझने के कार्य में छोटे-छोटे वाक्यों को समझना शामिल है, जो पूर्ण वाक्य के रूप में समझने के लिए मानसिक प्रवंचना के समान सेट का उपयोग करते हैं।

एक प्रोग्रामिंग परिप्रेक्ष्य से पुनरावृत्ति को समझने के लिए एक समस्या को देखना सबसे आसान है जिसे पुनरावृत्ति के साथ हल किया जा सकता है, और समझें कि यह क्यों होना चाहिए और इसका मतलब है कि आपको क्या करने की आवश्यकता है।

उदाहरण के लिए मैं सबसे बड़े सामान्य भाजक फ़ंक्शन का उपयोग करूँगा, या संक्षेप में gcd।

आप अपने दो नंबर हैं aऔर b। उनकी gcd को खोजने के लिए (न तो 0 है) आपको यह जाँचना होगा कि aक्या समान रूप से विभाज्य है b। यदि यह है तो bgcd है, अन्यथा आपको gcd bऔर शेष के लिए जाँच करनी होगी a/b

आपको पहले से ही यह देखने में सक्षम होना चाहिए कि यह एक पुनरावर्ती कार्य है, जैसा कि आपके पास gcd फ़ंक्शन है जिसे gcd फ़ंक्शन कहते हैं। बस इसे घर पर हथौड़ा करने के लिए, यहाँ यह c # में है (फिर से, मान लें 0 कभी भी पैरामीटर के रूप में पारित नहीं होता है):

int gcd(int a, int b)
{   
    if (a % b == 0) //this is a stopping condition
    {
        return b;
    }

    return (gcd(b, a % b)); //the call to gcd here makes this function recursive
}

एक कार्यक्रम में, एक रोक स्थिति होना महत्वपूर्ण है, अन्यथा आप फ़ंक्शन हमेशा के लिए पुनरावृत्ति करेंगे, जो अंततः एक स्टैक अतिप्रवाह का कारण होगा!

थोड़ी देर के लूप या कुछ अन्य पुनरावृत्ति निर्माणों के बजाय यहां पुनरावृत्ति का उपयोग करने का कारण यह है कि जैसा कि आप कोड को पढ़ते हैं, यह बताता है कि यह क्या कर रहा है और आगे क्या होगा, इसलिए यह पता लगाना आसान है कि क्या यह सही तरीके से काम कर रहा है ।


1
मुझे पानी-चक्र का उदाहरण मिला। दूसरा भाषा-उदाहरण पुनरावृत्ति की तुलना में अधिक विभाजित और जीतता है।
गुलशन

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

जल-चक्र में, चक्र सूर्य द्वारा शुरू किया गया है और चक्र का कोई अन्य तत्व सूरज को फिर से शुरू नहीं कर रहा है। तो, पुनरावर्ती कॉल कहाँ है?
गुलशन

पुनरावर्ती कॉल नहीं है! एक कार्य नहीं है। : D यह पुनरावर्ती है क्योंकि यह अपने आप को पुनरावृत्ति का कारण बनता है। झील से पानी झील में वापस आता है, और चक्र फिर से शुरू होता है। यदि कोई अन्य प्रणाली झील में पानी डाल रही थी, तो यह पुनरावृत्ति होगी।
मैट एलेन

1
पानी का चक्र थोड़ी देर का है। ज़रूर, थोड़ी देर के लूप को पुनरावृत्ति का उपयोग करके व्यक्त किया जा सकता है, लेकिन ऐसा करने से स्टैक को उड़ा दिया जाएगा। कृपया नहीं।
ब्रायन

0

यहाँ पुनरावृत्ति के लिए एक वास्तविक दुनिया उदाहरण है।

उन्हें कल्पना करें कि उनके पास एक कॉमिक संग्रह है और आप इसे एक बड़े ढेर में मिलाने जा रहे हैं। सावधान - अगर उनके पास वास्तव में एक संग्रह है, तो वे तुरंत आपको मार सकते हैं जब आप सिर्फ ऐसा करने के लिए विचार का उल्लेख करते हैं।

अब उन्हें इस मैनुअल की मदद से कॉमिक्स के इस बड़े अनसोल्ड ढेर को सॉर्ट करने दें:

Manual: How to sort a pile of comics

Check the pile if it is already sorted. If it is, then done.

As long as there are comics in the pile, put each one on another pile, 
ordered from left to right in ascending order:

    If your current pile contains different comics, pile them by comic.
    If not and your current pile contains different years, pile them by year.
    If not and your current pile contains different tenth digits, pile them 
    by this digit: Issue 1 to 9, 10 to 19, and so on.
    If not then "pile" them by issue number.

Refer to the "Manual: How to sort a pile of comics" to separately sort each
of the new piles.

Collect the piles back to a big pile from left to right.

Done.

यहां अच्छी बात यह है: जब वे एकल मुद्दों पर उतरते हैं, तो उनके पास जमीन पर उनके सामने दिखाई देने वाले स्थानीय ढेर के साथ पूर्ण "स्टैक फ्रेम" होता है। उन्हें मैनुअल के कई प्रिंटआउट दें और प्रत्येक ढेर के स्तर को एक निशान के साथ रखें जहां आप वर्तमान में इस स्तर पर हैं (यानी स्थानीय चर की स्थिति), इसलिए आप प्रत्येक पर वहां जारी रख सकते हैं।

मूल रूप से यही पुनरावृत्ति है: बहुत ही प्रक्रिया का प्रदर्शन, बस एक महीन विवरण स्तर पर जितना अधिक आप इसमें जाते हैं।


-1
  • बाहर निकलने की स्थिति में पहुंचने पर समाप्त करें
  • चीजों की स्थिति को बदलने के लिए कुछ करें
  • वर्तमान स्थिति के साथ काम शुरू करने के लिए सभी काम करते हैं

कुछ को व्यक्त करने के लिए पुनरावृत्ति एक बहुत ही संक्षिप्त तरीका है जिसे कुछ तक पहुंचने तक दोहराया जाना चाहिए।



-2

पुनरावृत्ति का एक अच्छा अन्वेषण शाब्दिक रूप से 'एक ऐसी कार्रवाई है जो स्वयं के भीतर से ही होती है "।

एक चित्रकार को दीवार पर पेंट करने पर विचार करें, यह पुनरावर्ती है क्योंकि यह क्रिया है "छत से फर्श तक की एक पट्टी को स्कूटर की तुलना में थोड़ी सी दाईं ओर और (एक पट्टी को छत से फर्श तक की तुलना में थोड़ी सी दाईं ओर पेंट करें और पेंट करें) सीलिंग से फर्श तक स्काइप से थोड़ी सी दाईं ओर (और) ()) "।

उसका पेंट () फ़ंक्शन अपने बड़े पेंट_वॉल () फ़ंक्शन को बनाने के लिए बार-बार कॉल करता है।

उम्मीद है कि इस गरीब चित्रकार की किसी तरह की हालत खराब हो :)


6
मेरे लिए, उदाहरण पुनरावृत्ति नहीं बल्कि पुनरावृत्ति प्रक्रिया की तरह लगता है।
गुलशन

@ गुलशन: पुनरावृत्ति और पुनरावृत्ति समान चीजें करते हैं, और अक्सर चीजें या तो अच्छी तरह से काम करेंगी। कार्यात्मक भाषाएं आमतौर पर पुनरावृत्ति के बजाय पुनरावृत्ति का उपयोग करती हैं। पुनरावृत्ति के बेहतर उदाहरण हैं जहां यह एक ही बात को लिखने के लिए अजीब होगा।
डेविड थॉर्नले
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.