दिलचस्प पोस्ट
मैं सेंकम आउटपुट को कैसे 'बिन' डायर में बनाऊं? WPF छवि एक कैनवास पर परतों के साथ पैन, ज़ूम और स्क्रॉल करें Google मानचित्र V2 का उपयोग करके एंड्रॉइड में मानचित्रव्यू का उपयोग कैसे करें? Git हुक को रिपॉजिटरी में डाल देना कोर डेटा NSPredicate "हटाए गए == NO" अपेक्षित के रूप में काम नहीं करता है mysql_escape_string वी.एस. mysql_real_escape_string क्यों #include <stdio.h> को printf () का उपयोग करने की आवश्यकता नहीं है? MySQL: स्ट्रैच निकालने के लिए रीगएक्स का उपयोग करें (रीगेक्स चुनें) जावा के लिए सीएसवी एपीआई मैं Win32 ऐप में डिबग आउटपुट विंडो को कैसे प्रिंट करूं? फोन नंबर देश कोड की सूची WPF में चौड़ाई और वास्तविक चौड़ाई के बीच अंतर क्या है? मैं एक असेंबल स्क्रिप्ट में शेल चर का उपयोग कैसे करूं? ऊंचाई के अनुसार डिवा पक्ष अनुपात बनाए रखें फ़ाइल प्रकार के द्वारा विम इंडेंटेन्टेशन व्यवहार बदलना

रिकर्सिव फ़ंक्शन के उदाहरण

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

वेब के समाधान से एकत्रित समाधान "रिकर्सिव फ़ंक्शन के उदाहरण"

यह चित्रण एक वास्तविक प्रोग्रामिंग भाषा के बजाय अंग्रेजी में है, लेकिन प्रक्रिया को गैर-तकनीकी तरीके से समझाया जा सकता है:

 एक बच्चा सो नहीं सकता था, इसलिए उसकी मां ने एक छोटे से मेंढक के बारे में एक कहानी को बताया,
   जो सो नहीं सका, इसलिए मेंढक की मां ने एक छोटे भालू के बारे में एक कहानी को बताया,
      जो नहीं सो सकता था, इसलिए भालू की मां ने एक छोटी भेड़ के बारे में एक कहानी को बताया
        ... जो सो गया
      ... और छोटे भालू सो गया;
   ... और छोटे मेंढक सो गए;
 ... और बच्चे सो गया।

पुनरावर्तन को समझने के लिए, सबसे पहले किसी भी पुनरावर्ती को समझना चाहिए।

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

तो फ़िबोनासी पुनरावर्ती आवेदन का एक अच्छा उदाहरण नहीं है, जबकि हनोई एक अच्छा है

इसलिए पुनरावृत्ति के अच्छे उदाहरणों में से अधिकांश विभिन्न अव्यवस्थाओं में वृक्षों का प्रवाह है।

उदाहरण के लिए: ग्राफ ट्रवर्सल – नोड का दौरा करने की आवश्यकता का कभी भी फिर से दौरा नहीं किया जाएगा, ग्राफ़ को एक पेड़ (एक पेड़ सरल चक्र के बिना एक जुड़ा हुआ ग्राफ़ होता है)

एल्गोरिदम को विभाजित और जीतें (त्वरित सॉर्ट, मर्ज सॉर्ट) – "विभाजन" के बाद के हिस्से बच्चों के नोड्स का गठन करते हैं, "जीत" पैरेंट नोड से बाल नोड्स तक किनारों का निर्माण करता है।

कैसे एक palindrome होने के लिए एक स्ट्रिंग परीक्षण के बारे में?

bool isPalindrome(char* s, int len) { if(len < 2) return TRUE; else return s[0] == s[len-1] && isPalindrome(&s[1], len-2); } 

बेशक, आप ऐसा कर सकते हैं एक पाश के साथ और अधिक कुशलतापूर्वक

एक पुनरावर्ती वंश पार्सर लिखें!

"सामान्य-संदिग्ध" के एक अन्य युगल क्क्कोोर्ट और मर्जर्स हैं

गणित की दुनिया से, एकरर्मन समारोह है :

 Ackermann(m, n) { if(m==0) return n+1; else if(m>0 && n==0) return Ackermann(m-1, 1); else if(m>0 && n>0) return Ackermann(m-1, Ackermann(m, n-1)); else throw exception; //not defined for negative m or n } 

यह हमेशा समाप्त होता है, लेकिन बहुत कम इनपुट के लिए बहुत बड़े परिणाम उत्पन्न होते हैं। एकेरमान (4, 2), उदाहरण के लिए, 2 65536-3 देता है।

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

 class List { public List(params object[] items) { foreach (object o in items) this.Add(o); } // Most of the implementation omitted … public override string ToString() { var ret = new StringBuilder(); ret.Append("( "); foreach (object o in this) { ret.Append(o); ret.Append(" "); } ret.Append(")"); return ret.ToString(); } } var lst = new List(1, 2, new List(3, 4), new List(new List(5), 6), 7); Console.WriteLine(lst); // yields: // ( 1 2 ( 3 4 ) ( ( 5 ) 6 ) 7 ) 

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

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

उसने कहा कि नेस्टेड पेड़ (जैसे एएसपी.नेट या विनफॉर्म्स) में नियंत्रण पाने का एक पुनरावर्ती तरीका है:

 public Control FindControl(Control startControl, string id) { if (startControl.Id == id) return startControl if (startControl.Children.Count > 0) { foreach (Control c in startControl.Children) { return FindControl(c, id); } } return null; } 

यहां फाइल सिस्टम की दुनिया से एक व्यावहारिक उदाहरण है। यह उपयोगिता एक निर्दिष्ट निर्देशिका के अंतर्गत फाइलों की गणना करता है। (मुझे याद नहीं है, लेकिन वास्तव में इस तरह कुछ समय पहले की जरूरत थी …)

 public static int countFiles(File f) { if (f.isFile()){ return 1; } // Count children & recurse into subdirs: int count = 0; File[] files = f.listFiles(); for (File fileOrDir : files) { count += countFiles(fileOrDir); } return count; } 

(ध्यान दें कि जावा में एक File इंस्टेंस या तो एक सामान्य फाइल या डायरेक्टरी का प्रतिनिधित्व करती है। यह उपयोगिता गिनती से निर्देशिका को शामिल नहीं करती है।)

एक आम असली उदाहरण उदाहरण के लिए होगा, जैसे FileUtils.deleteDirectory() कॉमन्स आईओ पुस्तकालय से; एपीआई दस्तावेज़ और स्रोत देखें

एक वास्तविक दुनिया का उदाहरण "लागत वाली सामग्री की लागत" समस्या है।

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

प्रति मिनट एक मानक श्रम लागत को देखते हुए, हमारे प्रत्येक उत्पाद का निर्माण करने में कितना खर्च होता है?

ओह, वैसे, कुछ हिस्सों (जैसे कॉर्ड) खरीदी जाती हैं, इसलिए हमें उनकी लागत सीधे पता है

लेकिन हम वास्तव में खुद कुछ हिस्सों का निर्माण करते हैं। हम एक आवास, एक स्टेटर, रोटर, शाफ्ट और बीयरिंग से मोटर बनाते हैं, और इसमें 15 मिनट लगते हैं।

और हम स्टायपेटर और रोटर को स्टाम्पिंग और वायर से बाहर कर देते हैं …

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

सबसे छोटा उदाहरण मुझे पता है कि न्युट मैन या बॉय टेस्ट है । इसके साथ ही रिकर्सन ने नेस्टेड फ़ंक्शन परिभाषाओं (क्लोजर), फंक्शन संदर्भ और निरंतर / फ़ंक्शन दोहरेवाद (नाम से कॉल) की अल्गोल विशेषताओं का उपयोग किया है।

जैसा कि अन्य लोगों ने पहले ही कहा है, बहुत सारे कैनोनिकल रिकर्सन उदाहरण अकादमिक हैं

अतीत में कुछ व्यावहारिक उपयोग हुए हैं I

1 – एक पेड़ संरचना, जैसे फाइल सिस्टम या रजिस्ट्री पर नेविगेट करना

2 – कंटेनर नियंत्रणों को विनियमित करते हैं जिसमें अन्य कंटेनर नियंत्रण (जैसे पैनल या समूहबॉक्स) हो सकते हैं

मेरी व्यक्तिगत पसंदीदा बाइनरी खोज है

संपादित करें: इसके अलावा, पेड़-ट्रवर्सल। उदाहरण के लिए एक फ़ोल्डर फ़ाइल संरचना चलना

गइडो वैन रॉसम के ग्राफ को कार्यान्वित करने के लिए पायथन में कुछ रिकर्सिव फ़ंक्शंस हैं, जो ग्राफ़ में दो नोड्स के बीच के पथ को खोजने के लिए हैं।

मेरा पसंदीदा सॉर्ट, मर्ज सॉर्ट करें

(पसंदीदा के बाद से मैं एल्गोरिथ्म को याद कर सकता हूं और यह खराब प्रदर्शन-वार नहीं है)

  • कारख़ाने का
  • गहराई में एक पेड़ का स्थानांतरण (एक फाइल सिस्टम में, एक गेम स्पेस या किसी अन्य मामले में)

स्ट्रिंग को पीछे करने के बारे में कैसे?

 void rev(string s) { if (!s.empty()) { rev(s[1..s.length]); } print(s[0]); } 

यह समझने में पुनरावर्तन को समझने में मदद मिलती है।

यहां एक नमूना है जिसे मैं इस साइट पर कुछ समय पहले एक मेनू पेड़ को उत्पन्न करने के लिए पोस्ट किया था: पुनरावर्ती उदाहरण

कैसे कुछ संसाधन सूचियों के बारे में, जैसे:

  • नक्शा (और और मैप, ऑरमप)
  • गुना (गुना, गुना)
  • फिल्टर
  • आदि…

एक बार एक समय पर, और बहुत पहले नहीं, प्राथमिक स्कूल के बच्चों ने लोगो और कछुए ग्राफ़िक्स का उपयोग करके पुनर्कथन किया। http://en.wikipedia.org/wiki/Turtle_graphics

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

पुनरावर्ती कार्य पुनरावर्ती परिभाषित आंकड़ों के साथ काम करने के लिए महान हैं:

  • एक प्राकृतिक संख्या शून्य या किसी अन्य प्राकृतिक संख्या का उत्तराधिकारी है
  • एक सूची खाली सूची या सामने एक तत्व के साथ दूसरी सूची है
  • एक पेड़ कुछ डेटा और शून्य या अधिक अन्य उपशीर्षक के साथ एक नोड है

आदि।

किसी स्तंभ नाम पर स्प्रेडशीट कॉलम इंडेक्स का अनुवाद करें

यह लगता है की तुलना में पेचीदा है, क्योंकि स्प्रैडशीट कॉलम '0' अंक को ठीक से नहीं संभालते। उदाहरण के लिए, यदि आप ज़ेड से एए तक बढ़ते हैं, तो आप एजे को अंक के रूप में लेते हैं, यह 9 से 11 या 9 से 00 की बजाय 10 की तरह होता है (ए 1 या 0 है या नहीं)। यहां तक ​​कि माइक्रोसॉफ्ट सपोर्ट का उदाहरण एएए की तुलना में कुछ भी गलत नहीं है!

रिकर्सिव समाधान इसलिए काम करता है क्योंकि आप उन नए अंकों की सीमाओं पर सही पढ़ सकते हैं। यह कार्यान्वयन VB.Net में है, और पहला कॉलम ('ए') को सूचकांक 1 के रूप में माना जाता है।

 Function ColumnName(ByVal index As Integer) As String Static chars() As Char = {"A"c, "B"c, "C"c, "D"c, "E"c, "F"c, "G"c, "H"c, "I"c, "J"c, "K"c, "L"c, "M"c, "N"c, "O"c, "P"c, "Q"c, "R"c, "S"c, "T"c, "U"c, "V"c, "W"c, "X"c, "Y"c, "Z"c} index -= 1 'adjust index so it matches 0-indexed array rather than 1-indexed column' Dim quotient As Integer = index \ 26 'normal / operator rounds. \ does integer division' If quotient > 0 Then Return ColumnName(quotient) & chars(index Mod 26) Else Return chars(index Mod 26) End If End Function