पुनरावृत्ति - क्या यह "विभाजित और जीत" या "कोड का पुन: उपयोग" है


11

पुनरावृत्ति - जैसा कि हम सभी जानते हैं - उन समस्याओं में से एक है - कि आपके सिर को चारों ओर लपेटने से ऐसा लगता है कि आपके प्रोग्रामिंग यात्रा में "मील का पत्थर" प्राप्त करना है।

लेकिन जब यह वास्तव में वास्तविक दुनिया की समस्याओं में इसका उपयोग करने की बात आती है - पुनरावृत्ति के यांत्रिकी जानना पर्याप्त नहीं है - किसी को उन समस्याओं की प्रकृति को भी समझना चाहिए जहां पुनरावृत्ति सबसे उपयुक्त समाधान है।

तो मेरा सवाल ये है...

  • "समस्या पैटर्न" क्या हैं जो पुनरावृत्ति के समाधान के लिए कहते हैं
  • "पुनरावृत्ति और जीत" रणनीति का एक रूप है या "कोड पुन: उपयोग" का एक रूप है - या, अपने आप में एक डिजाइन पैटर्न है
  • क्या आप हमें एक वास्तविक विश्व समस्या का उदाहरण दे सकते हैं जहाँ पुनरावृत्ति तत्काल समाधान के रूप में ध्यान में आती है

-- अपडेट करें --

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

हमारे पास पाठ का एक बड़ा चक था (लगभग 30 एमबी पाठ एक लिंक की गई सूची के रूप में structs), और हमें पूर्ण पाठ खोज के लिए इसका एक सूचकांक बनाने की आवश्यकता थी। हमें मेमोरी में पूरे इंडेक्स को बनाए रखने और हर 10 मिनट में टेक्स्ट को फिर से इंडेक्स करने की आवश्यकता थी।

हर 10 मिनट में हम पूरे टेक्स्ट की तुलना करेंगे (दो लिंक्ड लिस्ट, लाइन बाय लाइन) टेक्स्ट के एक नए जेनरेट किए गए चंक के साथ - यह देखने के लिए कि क्या लाइन बदली गई थी - और फिर हम केवल उस लाइन को फिर से इंडेक्स करेंगे - इस तरह हम ENTIRE पाठ को फिर से अनुक्रमित करने से बच सकते हैं। याद रखें - हमें दो 30 एमबी से जुड़ी सूचियों के बीच अंतर बिंदुओं को खोजने की आवश्यकता है।

मेरे एक सहकर्मी ने एक शानदार कार्यक्रम पेश किया जिसमें लाइनों की तुलना करने के लिए भारी पुनरावृत्ति का उपयोग किया गया - और फिर उन पदों को इकट्ठा किया जहां चक एक सरणी में भिन्न थे - हाँ मुझे पता है कि यह अजीब लगता है - यहाँ पुनरावृत्ति कैसे मदद कर सकती है - यह किया।

मुद्दा यह है कि वह कैसे देख सकता है कि पुनरावृत्ति के भारी उपयोग से इस समस्या को स्मार्ट तरीके से हल किया जा सकता है?


क्या इन दिनों 30 एमबी वास्तव में बड़ी है जहां अधिकांश कंप्यूटरों में रैम और टीबी हार्ड ड्राइव की जगह होती है?
जेबी किंग

30 एमबी बड़ा नहीं हो सकता है - लेकिन जिस तरह की डेटा संरचना पर विचार करते हुए हमारे पाठ में छंटनी की गई थी - यह वास्तव में पाठ का बहुत बड़ा हिस्सा था - और डिफ।
ट्रेकरोड

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

2
क्या मैं यह सोचने में सही हूं कि आपका "कोड पुन: उपयोग" अधिक "एक ही समय में अनिश्चित संख्या में संचालन की एक ही श्रृंखला को निष्पादित करने" के रूप में हुआ? यह "कोड के पुन: उपयोग" के रूप में अन्यत्र उपयोग के लिए सामान्य कोड लिखने के अर्थ में है।
एंडी हंट

4
लेकिन ट्री ट्रैवर्सल एक "वास्तविक वास्तविक समस्या" है, जो कई लोग लगभग दैनिक आधार पर मुठभेड़ करते हैं।
फाल्कन

जवाबों:


16
  • "समस्या पैटर्न" क्या हैं जो पुनरावृत्ति के समाधान के लिए कहते हैं

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

यह अभिव्यक्ति की बात है और प्रदर्शन की भी। Iterative एल्गोरिदम में अक्सर बेहतर प्रदर्शन होता है और इसे अनुकूलित करना आसान होता है। हालांकि, पुनरावर्ती एल्गोरिदम एक स्पष्ट अभिव्यक्ति से लाभान्वित होते हैं और इस प्रकार अक्सर पढ़ने, समझने और कार्यान्वित करने में आसान होते हैं।

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

  • "पुनरावृत्ति और जीत" रणनीति का एक रूप है या "कोड पुन: उपयोग" का एक रूप है - या, अपने आप में एक डिजाइन पैटर्न है

मैं इसे डिजाइन पैटर्न नहीं कहूंगा। यह अभिव्यक्ति की बात है। कभी-कभी एक पुनरावर्ती अभिव्यक्ति बस अधिक शक्तिशाली और अधिक अभिव्यंजक होती है और इस तरह बेहतर और क्लीनर कोड होता है।

  • क्या आप हमें एक वास्तविक विश्व समस्या का उदाहरण दे सकते हैं जहाँ पुनरावृत्ति तत्काल समाधान के रूप में ध्यान में आती है

कुछ भी है कि पेड़ों की मरम्मत करने की जरूरत है एक पुनरावर्ती एल्गोरिथ्म द्वारा ठीक से व्यक्त किया जाएगा।


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

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

आह, हाँ, आप बिल्कुल सही कह रहे हैं। मुझे "भाषाओं / भाषा संकलकों के कार्यान्वयन में कहा जाना चाहिए जो स्टैक-आधारित मेमोरी का उपयोग करते हैं"।
JAB

सामान्यतया, आप सही कह रहे हैं। मैं नाइटपैकिंग नहीं दिखाना चाहता था।
फाल्कन

2
अनंत सूचियों को पुनरावृत्ति के बिना व्यक्त किया जा सकता है, कम से कम पुनरावर्ती कार्यान्वयन के बिना। पाइथन जनरेटर इसे कर सकते हैं, जैसा कि आइकॉन में जेनरेटर से हो सकता है कि पाइथन से विचार उधार लिया गया हो। मेरा मानना ​​है कि एफ # इस चाल को कर सकता है, हालांकि मुझे यकीन नहीं है। मूल रूप से, जनरेटर सह-दिनचर्या (जैसे सहकारी मल्टीटास्किंग) का एक विशेष मामला है जो आलसी सूचियों को लागू करने के लिए अच्छी तरह से अनुकूल हैं। हर बार जब एक जनरेटर "पैदावार" करता है, तो कॉल करने वाले का नियंत्रण फिर से हो जाता है और जब तक अगला परिणाम नहीं मिलता है, जनरेटर निष्क्रिय रहता है।
स्टीव 314

8

"पुनरावृत्ति और जीत" रणनीति का एक रूप है या "कोड पुन: उपयोग" का एक रूप है - या, अपने आप में एक डिजाइन पैटर्न है

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

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

क्या आप हमें एक वास्तविक विश्व समस्या का उदाहरण दे सकते हैं जहाँ पुनरावृत्ति तत्काल समाधान के रूप में ध्यान में आती है

पेड़ का फंदा। या अधिक आम तौर पर ग्राफ ट्रैवर्सल। इसमें विशेष रूप से एक फ़ोल्डर संरचना का पता लगाना शामिल है।

और निश्चित रूप से कुछ भी है कि विभाजन और जीत या गतिशील प्रोग्रामिंग का उपयोग करता है क्योंकि दोनों स्वाभाविक रूप से पुनरावृत्ति के संदर्भ में व्यक्त किए जाते हैं।


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

1
@ स्टीव ३१४ मैं सहमत हूं कि डीपी का व्यावहारिक कार्यान्वयन (कंप्यूटर प्रोग्राम या मैन्युअल रूप से होना) शायद ही कभी पुनरावृत्ति का उपयोग करता है। लेकिन यह विचार स्वाभाविक रूप से एक पुनरावृत्ति संबंध पर आधारित है - जो सिर्फ एक पुनरावर्ती सूत्र है! - और एक बेस केस।
कोनराड रुडोल्फ

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

4
what are the "problem patterns" that call for the solution of recursion

भग्न की आत्म-समानता से व्युत्पन्न, मैं कहूंगा कि आत्म-समानता या आत्म-पहचान (या हालांकि इसे कहा जाता है) पुनरावृत्ति के लिए एक विशिष्ट समस्या पैटर्न है। Ie एक समस्या को उप-समस्याओं में विभाजित किया जा सकता है जिसमें मुख्य समस्या के समान संरचना होती है।

उल्लिखित ट्री ट्रैवर्सल में, प्रत्येक उप-पेड़ अपने आप में एक पूर्ण पेड़ है, मुख्य पेड़ की तरह, और मुख्य पेड़ दूसरे पेड़ के भीतर एक उप-पेड़ हो सकता है।

इसलिए मुझे लगता है कि आपके सहयोगी ने आपकी अनुक्रमण समस्या के आत्म-समानता गुणों की खोज की। या वह दूसरे रास्ते से चला गया और समस्या को एक स्व-समान प्रतिनिधित्व में बदल दिया।


1
+1 के लिए "एक समस्या को उप-समस्याओं में विभाजित किया जा सकता है, जिसमें मुख्य समस्या के समान संरचना है"
ट्रेकरोड

+1 और विरोधाभास: जहां समस्या का समाधान बाल परतों पर लागू होता है। मेरा वास्तविक विश्व उदाहरण क्रेडिट कार्ड शुल्क है जो "बैच" में योगदान देता है। अकाउंटिंग सॉफ्टवेयर में अलग-अलग चार्ज और बैच डिपॉजिट चेकिंग अकाउंट में होगा। मेरा मामला यहां एक सवाल बन सकता है क्योंकि स्टैकओवरफ्लो इसके बारे में बहुत तेज नहीं था। stackoverflow.com/questions/14719806
क्रिस के

3

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

"समस्या पैटर्न" क्या हैं जो पुनरावृत्ति के समाधान के लिए कहते हैं

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

"पुनरावृत्ति और जीत" रणनीति का एक रूप है या "कोड पुन: उपयोग" का एक रूप है - या, अपने आप में एक डिजाइन पैटर्न है

कोई नहीं। विभाजित और जीत पुनरावृत्ति का उपयोग करता है लेकिन स्टैक के साथ लागू किया जा सकता है। कोड पुन: उपयोग कुछ और को संदर्भित करता है। डिजाइन पैटर्न सरल पुनरावृत्ति की तुलना में अधिक जटिल हैं।

क्या आप हमें एक वास्तविक विश्व समस्या का उदाहरण दे सकते हैं जहाँ पुनरावृत्ति तत्काल समाधान के रूप में ध्यान में आती है

पार्सिंग और सब कुछ जो वृक्ष संरचनाओं से संबंधित है। यहां तक ​​कि पेड़ की संरचनाएं भी।


3

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

कुछ को ध्यान में रखना है कि कैसे कुछ समस्याओं को हल किया जा सकता है एक पुनरावृत्ति की तरह खराब तरीके से हल किया जा सकता है।

एक वास्तविक दुनिया उदाहरण के लिए जहां मैं पुनरावर्तन का उपयोग करूंगा, पुस्तक शेल्फ को बंद करके पुस्तक को पुनर्संरचनात्मक तरीके से काफी आसानी से किया जा सकता है। मैं सिर्फ किताब को देखता हूं और अगर ऐसा नहीं है तो मैं चाहता हूं कि मैं अगले एक पर चला जाऊं। मैं तब रुकता हूं जब मुझे या तो किताब मिल जाती है या पंक्ति समाप्त हो जाती है। एक किताब की जाँच करने और अगले एक पर आगे बढ़ने पर पाशन पुनरावृत्ति किया जा सकता है। शायद यह एक उदाहरण के लिए बहुत वास्तविक है।


2

"समस्या पैटर्न" क्या हैं जो पुनरावृत्ति के समाधान के लिए कहते हैं

बहुत सामान्य शब्दों में, जब आप एक समस्या हल कर रहे हैं, जहां f (x) = f (g (x)) के लिए पुनरावर्तन को कहा जाता है । जब तक आप अनंत पुनरावृत्ति के साथ ठीक नहीं हो जाते, तब तक जी (एक्स) को एक्स का मूल्यांकन नहीं करना चाहिए ।

"पुनरावृत्ति और जीत" रणनीति का एक रूप है या "कोड पुन: उपयोग" का एक रूप है - या, अपने आप में एक डिजाइन पैटर्न है

इनमे से कोई भी नहीं। यह बार-बार एक ही काम करने का एक तरीका है, कभी-कभी इनपुट पर भिन्नता के आधार पर। अवधारणा इस मामले के लिए डिज़ाइन पैटर्न, कोड पुन: उपयोग या यहां तक ​​कि कंप्यूटर की तुलना में लगभग लंबे समय तक रही है।

क्या आप हमें एक वास्तविक विश्व समस्या का उदाहरण दे सकते हैं जहाँ पुनरावृत्ति तत्काल समाधान के रूप में ध्यान में आती है

फैक्टर्यूयल्स, फाइबोनैचि अनुक्रम, ट्री ट्रैवर्सल और बहुत सारी अन्य समस्याओं को रिक्यूसर के साथ हल किया जा सकता है। अपने आप को बुलाने वाले एक समारोह के अर्थ में पुनरावृत्ति जरूरी नहीं है कि उन चीजों को लागू करने का सबसे अच्छा तरीका है; समान प्रभाव प्राप्त करने के अन्य तरीके हैं (जैसे, एक स्टैक और लूप) जो अधिक वांछनीय हो सकता है।


-1

जब आप एक पुनरावर्ती एल्गोरिथ्म लिखते हैं, तो आप आमतौर पर कोड के लिए समस्या की एक पुनरावर्ती परिभाषा का अनुवाद करते हैं। फिर आपको यह भी जानने की जरूरत नहीं है कि इसे कैसे निष्पादित किया जाएगा।

कार्यात्मक प्रोग्रामिंग में ऐसा होता है। वास्तव में, आप निर्दिष्ट करते हैं कि कैसे (बजाय) कैसे । दूसरे शब्दों में, आप आधार को परिभाषित करते हैं और फिर उप-समस्या की अवधि में अपनी समस्या को परिभाषित करते हैं।

उदाहरण के लिए Factorialएल्गोरिथ्म पर विचार करें

  • आधार को परिभाषित करें: फैक्टरियल (1) = 1;
  • फैक्टरियल एन को परिभाषित करें: फैक्टरियल (एन) = एन * फैक्टरियल (एन -1);

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

हालाँकि, किसी भी पुनरावर्ती कार्य की पुनरावर्ती परिभाषा नहीं होनी चाहिए। आप आधार को परिभाषित कर सकते हैं और उप-समस्याओं के समाधान (परिभाषा) के लिए मुख्य समस्या के समाधान को परिभाषित (परिभाषित) कर सकते हैं। लेकिन इस संबंध के लिए आपको एक प्रक्रिया की आवश्यकता हो सकती है।

एक उदाहरण है MergeSortजिसमें mergeउप-सरणियों के प्रकार के लिए पूरे सरणी को छाँटने की परिभाषा या समाधान से संबंधित एक अनिवार्य प्रक्रिया हो सकती है।

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