पुनरावृत्ति की अपनी समझ में सुधार के लिए संसाधन? [बन्द है]


13

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

तो क्या आपके पास इस क्षेत्र में कौशल बनाने के लिए कोई सुझाव / योजनाएं / संसाधन हैं? पुनरावृत्ति एक अजीब अवधारणा है, इसलिए मैं सोच रहा हूं कि इससे निपटने का तरीका समान रूप से अजीब और असभ्य हो सकता है।


28
प्रत्यावर्तन को समझने के लिए, पहले आपको प्रत्यावर्तन को समझना चाहिए।
एंड्रियास जोहानसन

1
डॉ। सेस द्वारा 'द कैट इन हैट कम बैक', यह पूरी तरह से उपयोगी नहीं हो सकता है, लेकिन बिल्ली पर पुनरावर्ती कॉल से उस pesky दाग से छुटकारा मिलता है। :-) यह भी एक बहुत जल्दी पढ़ने का लाभ है!
DKnight

2
अभ्यास, अभ्यास, अभ्यास।
डेविड थॉर्नले

20
पहले से ही इस सवाल का जवाब दिया: प्रोग्रामर.स्टैकएक्सचेंज.
com

3
@ ग्राहम बोरलैंड: यह अनंत पुनरावृत्ति का एक उदाहरण है। अधिकांश कार्यक्रमों में, बेस केस गुम होने पर आमतौर पर स्टैक ओवरफ्लो या आउट-ऑफ-मेमोरी त्रुटि होती है। वेबसाइट उपयोगकर्ताओं के लिए, यह सिर्फ भ्रम की स्थिति में हो सकता है। ;)
FrustratedWithFormsDesigner

जवाबों:


10

कुछ सरल से शुरू करें और इसे पेंसिल और पेपर से ट्रेस करें। Seriosuly। शुरू करने के लिए एक अच्छी जगह ट्री-ट्रैवर्सल एल्गोरिदम है, क्योंकि वे नियमित पुनरावृत्ति की तुलना में पुनरावृत्ति का उपयोग करके अधिक आसानी से नियंत्रित होते हैं। इसका जटिल उदाहरण नहीं है, लेकिन ऐसा कुछ है जो सरल है और आप इसके साथ काम कर सकते हैं।

हां, यह अजीब और कभी-कभी काउंटर-सहज है, लेकिन एक बार जब आप क्लिक करते हैं, तो एक बार "यूरेका!" आपको आश्चर्य होगा कि आपने इसे पहले कैसे नहीं समझा! ;) मैंने पेड़ों का सुझाव दिया क्योंकि वे पुनरावृत्ति में समझने के लिए सबसे आसान संरचना (आईएमओ) हैं, और वे एक पेंसिल और कागज का उपयोग करके काम करना आसान है। ;)


1
+1 यह वह तरीका है जिससे मैंने इसे टटोला है। उदाहरण के लिए, यदि आप OO का उपयोग कर रहे हैं, तो माता-पिता के बच्चे के संबंध के साथ कुछ कक्षाएं करें और फिर एक फ़ंक्शन / विधि बनाने की कोशिश करें जो यह जाँचता है कि किसी वस्तु का विशिष्ट पूर्वज है या नहीं।
Alb

5

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


1
+1 इस पुस्तक ने वास्तव में मेरे लिए यह किया। लेकिन इसका नाम बदलकर "द लिटिल
सीमर

4

मैं निश्चित रूप से एसआईसीपी का सुझाव देता हूं। इसके अलावा, आपको यहां लेखकों के परिचयात्मक पाठ्यक्रम वीडियो की जांच करनी चाहिए ; वे अविश्वसनीय रूप से दिमाग खोलने वाले हैं।

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


GEB वैसे भी पढ़ने लायक है; यहां तक ​​कि अगर वह जिन चीजों के बारे में बात करता है उनमें से कुछ थोड़ा दिनांकित हैं (मौलिक सीएस अनुसंधान पर कुछ प्रगति पिछले 40 वर्षों में की गई है) बुनियादी समझ नहीं है।
डोनल फैलो

2

अनिवार्य रूप से यह केवल अभ्यास करने के लिए नीचे आता है ... सामान्य समस्याएं लें (सॉर्ट करना, खोजना, गणित की समस्याएं, आदि) और देखें कि क्या आप एक ऐसा तरीका देख सकते हैं जिसमें उन समस्याओं को हल किया जा सकता है यदि आप कई बार एक फ़ंक्शन लागू करते हैं।

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

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

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


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

आपके लिए खुद को बनाने के लिए एक अच्छी सरल शुरुआती समस्या एक पुनरावर्ती कार्यक्रम लिखना होगा जो किसी संख्या के भाज्य का पता लगाता है।
केनेथ

किसी भी लूपिंग संरचना को पुनरावर्ती संरचना में रखा जा सकता है। किसी भी पुनरावर्ती संरचना को लूपिंग संरचना में रखा जा सकता है ... कम या ज्यादा। यह सीखने में सक्षम होने में समय और अभ्यास लगता है कि कब और कब पुनरावृत्ति का उपयोग न करें क्योंकि आपको याद रखना होगा कि जब आप पुनरावर्तन का उपयोग करते हैं तो हार्डवेयर स्तर पर उपयोग किए जाने वाले संसाधनों के संदर्भ में बहुत अधिक ओवरहेड होता है।
केनेथ

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

तो यहाँ मेरा प्रयास गुटबाजी पर है। निष्पक्ष होने के लिए मैंने इसे पहले देखा है, और हालांकि मैंने इसे खरोंच से लिखा था, स्मृति नहीं, यह शायद अभी भी आसान है जितना कि यह होगा। इसे JS में आज़माया, लेकिन इसमें एक त्रुटि थी, लेकिन def factorial(number): """return factorial of number""" if number == 0: return 0 elif number == 1: return 1 else: return number * factorial(number - 1)
एंड्रयू M

2

व्यक्तिगत रूप से मुझे लगता है कि अभ्यास के माध्यम से आपका सबसे अच्छा दांव है।

मैंने लोगो के साथ रिकर्सन सीखा। आप LISP का उपयोग कर सकते हैं। उन भाषाओं में पुनरावृत्ति स्वाभाविक है। नहीं तो आप यह गणितीय सुइट्स और श्रृंखला के अध्ययन में तुलना कर सकते हैं जहां आप क्या आगे क्या पहले आया था पर आधारित है व्यक्त करते हैं, यानी यू (n + 1) = f (यू (एन)), या अधिक जटिल श्रृंखला जहां कई चर है और कई निर्भरताएं, जैसे यू (एन) = जी (यू (एन -1), यू (एन -2), वी (एन), वी (एन -1)); वी (एन) = ज (यू (n-1), यू (n-2), वी (एन), वी (n-1)) ...

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

चित्रमय "समस्याएं" मुझे लगता है कि यह देखना आसान है। तो कोख के गुच्छे, फाइबोनैचि, ड्रैगन वक्र और भग्न को सामान्य रूप से देखें। लेकिन त्वरित-एल्गोरिथ्म को भी देखें ...

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


2

कंप्यूटर प्रोग्राम की संरचना और व्याख्या

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


0

जितना मुझे SICP और Gödel, Escher, Bach: एक अनन्त गोल्डन ब्रैड , Touretzky का LISP पसंद है : प्रतीकात्मक संगणना के लिए एक सौम्य परिचय एक अच्छा काम भी करता है।

मूल अवधारणा यह है: सबसे पहले, आपको यह जानना होगा कि जब आपका पुनरावर्ती कार्य समाप्त हो गया है, तो यह परिणाम वापस कर सकता है। फिर, आपको यह जानना होगा कि अपूर्ण मामले को कैसे लेना है, और इसे कुछ कम करना है जिस पर आप पुनरावृत्ति कर सकते हैं। पारंपरिक तथ्यात्मक (एन) उदाहरण के लिए, आप समाप्त हो गए हैं जब एन <= 1, और अधूरा मामला एन * फैक्टोरियल (एन -1) है।

बहुत बदसूरत उदाहरण के लिए, एकरमैन का कार्य A (m, n) है।

A(0,n) = n+1.                                   This is the terminal case.
A(m,0) = A(m-1,1) if m > 0.                     This is a simple recursion.
A(m,n) = A(m-1, A(m, n-1)) if m > 0 and n > 0.  This one is ugly.

0

मैं कुछ एमएल-शैली कार्यात्मक भाषाओं जैसे OCaml या Haskell के साथ खेलने का सुझाव देता हूं। मैंने पाया है कि पैटर्न मिलान वाक्य रचना वास्तव में मुझे और भी अपेक्षाकृत जटिल पुनरावर्ती काम करता है, निश्चित रूप से बहुत बेहतर की तुलना में योजना के समझने में मदद की ifऔर condबयान। (मैंने उसी समय हास्केल और स्कीम सीखी।)

यहाँ विपरीत के लिए एक तुच्छ उदाहरण है:

(define (fib n)
   (cond [(= n 0) 0]
         [(= n 1) 1]
         [else (+ (fib (- n 1)) (fib (- n 2)))]))

और पैटर्न मिलान के साथ:

fib 0 = 0
fib 1 = 1
fib n = fib (n - 1) + fib (n - 2)

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

मैं विशेष रूप से हास्केल की सलाह देता हूं क्योंकि यह बहुत अच्छी वाक्य रचना के साथ एक सरल भाषा है। यह अधिक उन्नत विचारों के साथ काम करने के लिए बहुत आसान बनाता है जैसे corecursion :

fibs = 0 : 1 : zipWith (+) fibs (drop 1 fibs)
fib n = fibs !! n

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


0

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

उदाहरण पास्कल में हैं, लेकिन इतने बड़े नहीं हैं कि भाषा की पसंद परेशान हो।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.