रिकर्सन का उपयोग क्यों करें?

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

आपकी सहायता के लिये पहले से ही धन्यवाद! मैं वास्तव में इसकी प्रशंसा करता हूँ!

3
प्रासंगिक पढ़ता है: stackoverflow.com/questions/2651112/…
जोड़ा लेखक reto, स्रोत

2 उत्तर

यदि आपके पास पेड़ डेटा संरचना है और आप इसे गहराई से पहले क्रम में चलना चाहते हैं, तो रिकर्सन केवल ऐसा करने का तरीका है।

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

3
जोड़ा
@cHao आमतौर पर इसके लिए सिंगल लिंक्ड सूचियों का उपयोग करना आम है और इसे स्पेगेटी स्टैक कहा जाता है। इसका उपयोग गतिशील भाषाओं जैसे योजना, स्मॉलटाक और जंग में किया जाता है।
जोड़ा लेखक Sylwester, स्रोत
@ ट्रेनिन: एक स्टैक है रिकर्सन का उपयोग कर एक पुनरावृत्ति तरीका।
जोड़ा लेखक Mike Dunlavey, स्रोत
@mbeckish: यदि आप किसी भी भाषा में एक पुनरावर्ती कार्य लिखते हैं, तो संकलक इसे एक गैर-पुनरावर्ती निर्देश धारा में बदल देता है जो एक ढेर का उपयोग करता है। यही वही है जो पुनरावृत्ति है। यह भी देखें trampoline-style code
जोड़ा लेखक Mike Dunlavey, स्रोत
@cHao: तुम सही हो। हम बाल बांट रहे हैं। एक औपचारिक ढेर और एक स्पष्ट ढेर के बीच एक सूक्ष्म अंतर है, कहें, फोरट्रान 77. स्पष्ट ढेर का एक सीमित आकार है, जबकि औपचारिक ढेर कम से कम भाषा में नहीं है। बेशक, किसी भी वास्तविक कार्यान्वयन में, हर ढेर सीमित है।
जोड़ा लेखक Mike Dunlavey, स्रोत
@cHao: स्टैक्स को समझने के असीमित तरीके हैं, जहां एक स्टैक किसी भी अवधारणात्मक असीमित डेटा संरचना है जो कम से कम push और pop संचालन को स्टोर और एक्सेस करने के लिए समर्थन कर सकता है अंतिम-इन-फर्स्ट-आउट आधार पर जानकारी। यह एक स्टैक सूचक के साथ सिर्फ एक साधारण सरणी नहीं है।
जोड़ा लेखक Mike Dunlavey, स्रोत
@ बिली थोर्टन: यह हल होने वाली समस्या पर निर्भर करता है। यदि आपके पास जिस समस्या के लिए पेड़ की गहराई से चलने की आवश्यकता है, तो आप इसे बिना रिकर्सन के कर सकते हैं। तो यदि आप इसे ऐसी भाषा में कर रहे हैं जिसमें रिकर्सिव फ़ंक्शन नहीं हैं, तो आप इसे नकली बनाते हैं, ट्रैम्पोलिन शैली में, क्योंकि सीएचओ कह रहा था। एक भाषा सुविधा के रूप में पुनरावृत्ति सबसे पहले, मेरे ज्ञान के लिए, Algol (शायद Lisp) में दिखाई दिया। फिर बाद में, कंप्यूटर ढेर से सुसज्जित थे, इसलिए संकलन कार्यों को संकलित करना आसान बना दिया गया था। यदि आप इससे पहले एक कंप्यूटर देखना चाहते हैं, तो आईबीएम 360 या 70 9 4 देखें।
जोड़ा लेखक Mike Dunlavey, स्रोत
तो वास्तव में, इसका उपयोग तब किया जाता है जब पुनरावृत्ति बस अनुपलब्ध हो? जैसा कि @ नाथन ने टिप्पणी की, वहां कुछ ऐसी भाषा भी है जिनके पास पुनरावृत्ति नहीं है (जो मुझे नहीं पता कि वे क्यों नहीं करेंगे!)
जोड़ा लेखक Billy Thorton, स्रोत
सिस्टम के कॉल स्टैक का स्पष्ट रूप से उपयोग करने के बजाए, एक स्पष्ट स्टैक का उपयोग करने वाले अलगाव के लिए एक शब्द है। उन्हें "डेटा-रिकर्सिव" कहा जाता है।
जोड़ा लेखक cHao, स्रोत
@ माइकडुनलेवी: ट्रू रिकर्सन कॉल कॉल स्टैक का स्पष्ट रूप से उपयोग करता है। डेटा-रिकर्सन स्पष्ट रूप से अपने स्वयं के ढेर का उपयोग करता है। एक अंतर है, खासकर उन भाषाओं में जो असली रिकर्सन अच्छी तरह से नहीं करते हैं - उनमें से अधिकतर दिन भर में डेटा-रिकर्सन कर सकते हैं।
जोड़ा लेखक cHao, स्रोत
हालांकि, आपको आवश्यकता एक स्टैक भी नहीं है। यह सबसे स्वाभाविक समाधान है, लेकिन केवल एक ही नहीं। एक दोगुनी-लिंक्ड सूची की कल्पना करें, जहां प्रत्येक नोड में विस्तारित ध्वज होता है। जड़ युक्त सूची के साथ शुरू करें। जैसे ही आप सूची में भाग लेते हैं, यदि आप एक नोड देखते हैं जिसे अभी तक विस्तारित नहीं किया गया है, और इसमें कोई बच्चा है, तो वर्तमान नोड से पहले बच्चों को सम्मिलित करें, वर्तमान नोड का विस्तारित ध्वज सेट करें, और आगे बढ़ें इटरेटर वापस ताकि बच्चों को संसाधित अगले नोड्स होंगे। अन्यथा, उस नोड को संसाधित करें और पुनरावर्तक को आगे बढ़ाएं।
जोड़ा लेखक cHao, स्रोत
@ माइकडुनलेवी: <कोड> पुश बीच में सम्मिलित नहीं होता है। यदि ऐसा होता है, तो स्टैक की परिभाषा के बाहर वह कदम। यही कारण है कि मैंने दोगुनी-लिंक्ड सूचियों का उल्लेख क्यों किया; आपको पॉप करने की आवश्यकता नहीं है, और अंत में, आपकी सूची में उन सभी नोड्स शामिल हो सकते हैं, जिन्हें आप संसाधित करना चाहते हैं।
जोड़ा लेखक cHao, स्रोत
@ माइकडुनलेवी - अगर यह केवल एक नियमित स्टैक डेटा संरचना का उपयोग कर रहा है, न कि कॉल स्टैक, तो मैं उस रिकर्सन को कॉल नहीं करूंगा।
जोड़ा लेखक mbeckish, स्रोत
रिकर्सन एकमात्र तरीका नहीं है - यह समस्या को हल करने का सबसे सरल, सबसे स्वाभाविक तरीका है। हालांकि, एक ढेर का उपयोग कर एक पुनरावृत्ति दृष्टिकोण भी काम करेगा।
जोड़ा लेखक Trenin, स्रोत

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

2
जोड़ा