पुनरावर्तन की व्याख्या करने के लिए , मैं विभिन्न स्पष्टीकरण के संयोजन का उपयोग करता हूं, आमतौर पर दोनों की कोशिश करते हैं:
- अवधारणा की व्याख्या करें,
- यह समझाएं कि यह क्यों मायने रखता है,
- इसे पाने का तरीका बताएं।
शुरुआत के लिए, वुल्फराम | अल्फा इसे विकिपीडिया की तुलना में अधिक सरल शब्दों में परिभाषित करता है :
एक अभिव्यक्ति जैसे कि प्रत्येक शब्द एक विशेष गणितीय ऑपरेशन को दोहराकर उत्पन्न होता है।
गणित
यदि आपका छात्र (या आप जिस व्यक्ति को भी समझाते हैं, अब से मैं छात्र कहूंगा) की कम से कम कुछ गणितीय पृष्ठभूमि है, तो उन्होंने स्पष्ट रूप से श्रृंखला का अध्ययन करके पुनरावृत्ति और उनके पुनरावृत्ति की धारणा और उनके पुनरावृत्ति संबंध का सामना किया है ।
शुरू करने का एक बहुत अच्छा तरीका एक श्रृंखला के साथ प्रदर्शित करना है और यह बताना है कि यह काफी सरलता से है।
- एक गणितीय समारोह ...
- ... जो स्वयं को n- वें तत्व के अनुरूप मान की गणना करने के लिए कहता है ...
- ... और जो कुछ सीमाओं को परिभाषित करता है।
आमतौर पर, आप या तो "हुह, व्हाट" को सबसे अच्छे से प्राप्त करते हैं क्योंकि वे अभी भी इसका उपयोग नहीं करते हैं, या अधिक संभावना सिर्फ एक बहुत ही गहरे खर्राटे की है।
कोडिंग उदाहरण
बाकी के लिए, यह वास्तव में मैं क्या में प्रस्तुत की एक विस्तृत संस्करण है परिशिष्ट का मेरा उत्तर के लिए प्रश्न आप के बारे में संकेत दिए गए की ओर इशारा किया (बुरा यमक)।
इस स्तर पर, मेरे छात्र आमतौर पर जानते हैं कि स्क्रीन पर कुछ कैसे प्रिंट किया जाए। यह मानते हुए कि हम C का उपयोग कर रहे हैं, वे जानते हैं कि कैसे एक चार चार्ट का उपयोग करके प्रिंट करना है write
या printf
। वे नियंत्रण छोरों के बारे में भी जानते हैं।
मैं आमतौर पर कुछ दोहराव और सरल प्रोग्रामिंग समस्याओं का सहारा लेता हूं जब तक कि वे इसे प्राप्त न करें:
कारख़ाने का
फैक्टरियल समझने के लिए एक बहुत ही सरल गणित अवधारणा है, और कार्यान्वयन इसके गणितीय प्रतिनिधित्व के बहुत करीब है। हालाँकि, वे इसे पहले नहीं प्राप्त कर सकते हैं।
अक्षर
वर्णमाला संस्करण उन्हें अपने पुनरावर्ती कथनों के क्रम के बारे में सोचने के लिए सिखाना दिलचस्प है। संकेत के साथ की तरह, वे सिर्फ आप पर बेतरतीब ढंग से लाइनें फेंक देंगे। मुद्दा यह है कि उन्हें इस बोध में लाया जाए कि स्थितियों में संशोधन करके या केवल अपने कार्य में कथनों के क्रम को बदलकर एक लूप को उलटा किया जा सकता है । यहीं से वर्णमाला की छपाई में मदद मिलती है, क्योंकि यह उनके लिए कुछ दृश्य है। बस उन्हें एक फ़ंक्शन लिखना है जो प्रत्येक कॉल के लिए एक वर्ण प्रिंट करेगा, और अगले (या पिछले) एक को लिखने के लिए खुद को पुनरावर्ती कहता है।
एफपी प्रशंसक, इस तथ्य को छोड़ दें कि आउटपुट स्ट्रीम में सामान की छपाई अब के लिए एक साइड इफेक्ट है ... चलो एफपी-फ्रंट पर बहुत अधिक परेशान नहीं करें। (लेकिन यदि आप सूची समर्थन के साथ एक भाषा का उपयोग करते हैं, तो प्रत्येक पुनरावृत्ति और बस अंतिम परिणाम पर एक सूची को स्वतंत्र करने के लिए स्वतंत्र महसूस करें। लेकिन आमतौर पर मैं उन्हें सी के साथ शुरू करता हूं, जो दुर्भाग्य से इस तरह की समस्याओं और अवधारणाओं के लिए सबसे अच्छा नहीं है) ।
घातांक
घातांक समस्या थोड़ी अधिक कठिन है ( सीखने के इस चरण में)। जाहिर है कि अवधारणा वास्तव में एक फैक्टरियल के समान है और इसमें कोई जोड़ा जटिलता नहीं है ... सिवाय इसके कि आपके पास कई पैरामीटर हैं। और यह आमतौर पर लोगों को भ्रमित करने और शुरुआत में उन्हें फेंकने के लिए पर्याप्त है।
इसका सरल रूप:
पुनरावृत्ति द्वारा इस तरह व्यक्त किया जा सकता है:
और जोर से
एक बार इन सरल समस्याओं को दिखाया गया है और ट्यूटोरियल में फिर से लागू किया गया है, तो आप थोड़ा और अधिक कठिन (लेकिन बहुत क्लासिक) अभ्यास दे सकते हैं:
- फाइबोनैचि संख्या,
- सबसे बड़ा आम भाजक ,
- 8-क्वींस समस्या,
- हनोई के टावर्स खेल,
- और अगर आपके पास एक ग्राफिकल वातावरण है (या इसके लिए या एक टर्मिनल आउटपुट के लिए कोड स्टब्स प्रदान कर सकते हैं या वे पहले से ही इसका प्रबंधन कर सकते हैं), बातें:
- और व्यावहारिक उदाहरणों के लिए, लेखन पर विचार करें:
- ट्री ट्रैवर्सल एल्गोरिथ्म,
- एक साधारण गणितीय अभिव्यक्ति पार्सर,
- माइंसवीपर गेम।
नोट: फिर से, इनमें से कुछ वास्तव में कोई कठिन नहीं हैं ... वे समस्या को बिल्कुल उसी कोण से या थोड़े अलग तरीके से देखते हैं। लेकिन अभ्यास परिपूर्ण बनाता है।
सहायकों
संदर्भ
कुछ पढ़ने में कभी दर्द नहीं होता। खैर यह पहली बार में होगा, और वे और भी अधिक खो दिया महसूस करेंगे। यह उस तरह की चीज है जो आप पर बढ़ती है और जो आपके सिर के पीछे एक दिन तक बैठती है जब तक कि आपका एहसास नहीं हो जाता है कि आप अंततः इसे प्राप्त करते हैं। और फिर आप इन सामानों को वापस पढ़ते हैं। प्रत्यावर्तन , प्रत्यावर्तन कंप्यूटर विज्ञान में और आवर्ती संबंध पृष्ठों विकिपीडिया पर अब के लिए करना होगा।
स्तर / गहराई
यह मानते हुए कि आपके छात्रों के पास कोडिंग का अधिक अनुभव नहीं है, कोड स्टब्स प्रदान करें। पहले प्रयासों के बाद, उन्हें एक मुद्रण कार्य दें जो पुनरावृत्ति स्तर प्रदर्शित कर सकता है। स्तर के संख्यात्मक मूल्य को प्रिंट करने से मदद मिलती है।
स्टैक-के रूप में दराज आरेख
मुद्रित परिणाम (या स्तर के आउटपुट) को इंडेंट करने में भी मदद मिलती है, क्योंकि यह एक अन्य विज़ुअल प्रतिनिधित्व देता है कि आपका प्रोग्राम क्या कर रहा है, फ़ाइल सिस्टम एक्सप्लोरर में फ़ोल्डर या फ़ोल्डर जैसे स्टैक संदर्भों को खोलना और बंद करना।
पुनरावर्ती
यदि आपका छात्र पहले से ही कंप्यूटर कल्चर में निपुण है, तो वे पहले से ही कुछ प्रोजेक्ट्स / सॉफ्टवेयर्स का उपयोग कर सकते हैं जिनके नाम पुनरावर्ती शब्दकोषों का उपयोग कर रहे हैं । यह कुछ समय से चली आ रही परंपरा है, खासकर 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
सिर्फ सामान।
सिर्फ गणितीय श्रृंखला से शुरू करने से लिखना और लागू करना आसान हो जाता है क्योंकि अनुबंध स्पष्ट रूप से अभिव्यक्तियों द्वारा परिभाषित किया गया है। उदाहरण के लिए, हॉफ़स्टैटर महिला और पुरुष अनुक्रम :
हालांकि कोड के संदर्भ में, यह ध्यान दिया जाना चाहिए कि पारस्परिक रूप से पुनरावर्ती समाधान के कार्यान्वयन से अक्सर कोड दोहराव होता है और इसे एक ही पुनरावर्ती रूप में सुव्यवस्थित किया जाना चाहिए (देखें पीटर नॉरविग की हर सुडोकू पहेली को हल करते हुए ।