पुनरावृत्ति समझने के लिए एक मुश्किल विषय है और मुझे नहीं लगता कि मैं इसे पूरी तरह से यहाँ न्याय कर सकता हूं। इसके बजाय, मैं आपके द्वारा यहां दिए गए कोड के विशेष टुकड़े पर ध्यान केंद्रित करने की कोशिश करूंगा और यह जानने की कोशिश करूंगा कि समाधान कैसे काम करता है और कोड के मैकेनिक इसके परिणाम की गणना कैसे करते हैं।
आपके द्वारा यहां दिया गया कोड निम्नलिखित समस्या को हल करता है: आप सभी पूर्णांकों का योग a से b, समावेशी जानना चाहते हैं। अपने उदाहरण के लिए, आप संख्याओं का योग 2 से 5, समावेशी चाहते हैं, जो है
2 + 3 + 4 + 5
किसी समस्या को पुनरावर्ती रूप से हल करने का प्रयास करते समय, पहले चरण में से एक यह पता लगाना चाहिए कि समस्या को उसी संरचना के साथ छोटी समस्या में कैसे तोड़ा जाए। तो मान लीजिए कि आप संख्याओं को 2 से 5 तक जोड़ना चाहते थे, समावेशी। इसे सरल बनाने का एक तरीका यह है कि उपरोक्त योग को फिर से लिखा जा सकता है
2 + (3 + 4 + 5)
यहाँ, (3 + 4 + 5) सभी पूर्णांकों का योग 3 और 5 के बीच होता है, समावेशी होता है। दूसरे शब्दों में, यदि आप 2 और 5 के बीच के सभी पूर्णांकों का योग जानना चाहते हैं, तो 3 और 5 के बीच के सभी पूर्णांकों की राशि की गणना करके शुरू करें, फिर 2 को जोड़ें।
तो आप 3 और 5 के बीच सभी पूर्णांकों के योग को कैसे सम्मिलित करते हैं? खैर, वह योग है
3 + 4 + 5
जिसके बदले सोचा जा सकता है
3 + (4 + 5)
यहां, (4 + 5) 4 और 5 के बीच के सभी पूर्णांकों का योग है। इसलिए, यदि आप 3 और 5 के बीच सभी संख्याओं के योग की गणना करना चाहते हैं, तो आप 4 और 5 के बीच के सभी पूर्णांकों का योग गणना करेंगे, फिर 3 जोड़ेंगे।
यहाँ एक पैटर्न है! यदि आप एक और बी के बीच पूर्णांकों के योग की गणना करना चाहते हैं, तो आप निम्न कार्य कर सकते हैं। सबसे पहले, पूर्णांक + a और b के बीच पूर्णांकों के योग की गणना कीजिए। इसके बाद, उस कुल में एक जोड़ें। आप देखेंगे कि "पूर्णांक 1 और b के बीच पूर्णांक की राशि की गणना, समावेशी" से होती है, एक ही तरह की समस्या है जो हम पहले से ही हल करने की कोशिश कर रहे हैं, लेकिन थोड़ा अलग मापदंडों के साथ। A से b, समावेशी से कंप्यूटिंग के बजाय, हम + 1 से b, समावेशी से कंप्यूटिंग कर रहे हैं। वह पुनरावर्ती कदम है - बड़ी समस्या ("योग से बी, समावेशी") को हल करने के लिए, हम समस्या को खुद के एक छोटे संस्करण में कम करते हैं ("योग + एक से 1 तक, समावेशी।")।
यदि आप ऊपर दिए गए कोड पर एक नज़र डालते हैं, तो आप देखेंगे कि इसमें यह चरण है:
return a + sumInts(a + 1, b: b)
यह कोड उपर्युक्त तर्क का एक अनुवाद है - यदि आप a से b, समावेशी में योग करना चाहते हैं, a + 1 to b, समावेशी (जो कि पुनरावर्ती कॉल sumInt
s करने के लिए है ) से शुरू करें, फिर जोड़ें a
।
बेशक, अपने आप से यह दृष्टिकोण वास्तव में काम नहीं करेगा। उदाहरण के लिए, आप 5 से 5 के बीच सभी पूर्णांकों के योग को कैसे सम्मिलित करेंगे? ठीक है, हमारे वर्तमान तर्क का उपयोग करते हुए, आप 6 और 5 के बीच सभी पूर्णांकों का योग, समावेशी की गणना करेंगे, फिर 5 जोड़ेंगे। तो आप 6 और 5 के बीच के सभी पूर्णांकों के योग को कैसे सम्मिलित करते हैं? ठीक है, हमारे वर्तमान तर्क का उपयोग करते हुए, आप 7 और 5 के बीच के सभी पूर्णांकों का योग, समावेशी की गणना करेंगे, फिर 6. जोड़ें। आपको यहाँ एक समस्या दिखाई देगी - यह सिर्फ और सिर्फ चलता रहता है!
पुनरावर्ती समस्या को हल करने में, समस्या को सरल बनाने से रोकने के लिए कुछ उपाय करने की आवश्यकता है और इसके बजाय बस इसे सीधे हल करें। आमतौर पर, आपको एक सरल मामला मिलेगा जहां उत्तर को तुरंत निर्धारित किया जा सकता है, फिर सीधे सरल मामलों को हल करने के लिए अपने समाधान की संरचना करें जब वे उत्पन्न होते हैं। इसे आम तौर पर बेस केस या पुनरावर्ती आधार कहा जाता है ।
तो इस विशेष समस्या में आधार मामला क्या है? जब आप पूर्णांक को b से, समावेशी से जोड़ते हैं, यदि ऐसा होता है, तो b से बड़ा होना है, तो इसका उत्तर है 0 - श्रेणी में कोई संख्या नहीं है! इसलिए, हम अपना समाधान इस प्रकार करेंगे:
- अगर a> b, तो उत्तर 0 है।
- अन्यथा ((b), इस प्रकार उत्तर प्राप्त करें:
- पूर्णांकों के योग की गणना + 1 और b के बीच करें।
- उत्तर पाने के लिए a जोड़ें।
अब, इस छद्मकोड की अपने वास्तविक कोड से तुलना करें:
func sumInts(a: Int, b: Int) -> Int {
if (a > b) {
return 0
} else {
return a + sumInts(a + 1, b: b)
}
}
ध्यान दें कि स्यूडोकोड और इस वास्तविक कोड में उल्लिखित समाधान के बीच लगभग एक-से-एक नक्शा है। पहला चरण आधार मामला है - उस स्थिति में जब आप संख्याओं की एक खाली सीमा का योग पूछते हैं, आपको 0. प्राप्त होता है, + 1 और b के बीच योग की गणना करें, फिर एक जोड़ दें।
अब तक, मैंने कोड के पीछे सिर्फ एक उच्च-स्तरीय विचार दिया है। लेकिन आपके पास दो अन्य प्रश्न थे, बहुत अच्छे प्रश्न। सबसे पहले, यह हमेशा 0 क्यों नहीं लौटाता, यह देखते हुए कि फ़ंक्शन 0 को लौटाने के लिए कहता है यदि a> b? दूसरा, 14 वास्तव में कहां से आता है? आइए इन्हें बारी-बारी से देखें।
आइए, एक बहुत ही सरल मामले की कोशिश करते हैं। पुकारे तो क्या होगा sumInts(6, 5)
? इस मामले में, कोड के माध्यम से ट्रेस करते हुए, आप देखते हैं कि फ़ंक्शन केवल 0. लौटाता है - यह करने के लिए सही बात है, - सीमा में कोई संख्या नहीं है। अब, कुछ कठिन प्रयास करें। जब आप कॉल करते हैं तो क्या होता है sumInts(5, 5)
? खैर, यहाँ क्या होता है:
- तुम बुलाओ
sumInts(5, 5)
। हम else
शाखा में आते हैं , जो `a + sumInts (6, 5) का मान लौटाते हैं।
- यह
sumInts(5, 5)
निर्धारित करने के लिए कि sumInts(6, 5)
हमें क्या करना है, हम क्या कर रहे हैं और कॉल करने की आवश्यकता है sumInts(6, 5)
।
sumInts(6, 5)
कहा जाता है। यह if
शाखा में प्रवेश करता है और लौटता है 0
। हालांकि, इस उदाहरण को sumInts
इसके द्वारा कहा गया था sumInts(5, 5)
, इसलिए रिटर्न वैल्यू का संचार वापस किया जाता है sumInts(5, 5)
, न कि शीर्ष स्तर के कॉलर को।
sumInts(5, 5)
अब 5 + sumInts(6, 5)
वापस पाने के लिए गणना कर सकते हैं 5
। इसके बाद यह शीर्ष स्तर के कॉलर को वापस कर देता है।
ध्यान दें कि यहां मूल्य 5 का गठन कैसे किया गया था। हमने एक सक्रिय कॉल के साथ शुरुआत की sumInts
। इसने एक और पुनरावर्ती कॉल को निकाल दिया, और उस कॉल द्वारा लौटाए गए मूल्य ने सूचना को वापस संचारित किया sumInts(5, 5)
। तब कॉल sumInts(5, 5)
ने बदले में कुछ गणना की और कॉल करने वाले को वापस मान दिया।
यदि आप इसके साथ प्रयास करते हैं sumInts(4, 5)
, तो यहां क्या होगा:
sumInts(4, 5)
लौटने की कोशिश करता है 4 + sumInts(5, 5)
। ऐसा करने के लिए, यह कॉल करता है sumInts(5, 5)
।
sumInts(5, 5)
लौटने की कोशिश करता है 5 + sumInts(6, 5)
। ऐसा करने के लिए, यह कॉल करता है sumInts(6, 5)
।
sumInts(6, 5)
वापस 0 रिटर्न sumInts(5, 5).</li>
<li>
समनट (5, 5) now has a value for
समनट (6, 5) , namely 0. It then returns
5 + 0 = 5` पर।
sumInts(4, 5)
अब के लिए एक मूल्य है sumInts(5, 5)
, अर्थात् 5. यह फिर लौटता है 4 + 5 = 9
।
दूसरे शब्दों में, जो मूल्य लौटाया जाता है वह एक समय में एक मान को sumInts
जोड़कर बनता है, प्रत्येक बार किसी विशेष पुनरावर्ती कॉल द्वारा लौटाए गए मूल्य और वर्तमान मूल्य पर जोड़कर a
। जब रिकर्सन बॉटम आउट हो जाता है, तो सबसे गहरी कॉल 0. लौटाती है, हालांकि, वह मान तुरंत पुनरावर्ती कॉल श्रृंखला से बाहर नहीं निकलता है; इसके बजाय, यह केवल उसके ऊपर एक परत को पुनरावर्ती कॉल करने के लिए मान वापस करता है। इस तरह, प्रत्येक पुनरावर्ती कॉल सिर्फ एक और संख्या में जुड़ती है और श्रृंखला में उच्चतर रिटर्न करती है, समग्र योग के साथ समापन होता है। एक अभ्यास के रूप में, इस बात का पता लगाने की कोशिश करें sumInts(2, 5)
कि आप किस चीज से शुरुआत करना चाहते हैं।
उम्मीद है की यह मदद करेगा!