C # (I भाग 1) में Iterators को लागू करना ।
अब जब आपके पास अपने सामान में एक सामान्य विचार है कि पुनरावृत्तियों के पीछे क्या है, तो आप पहले से ही उनके उपयोग के बारे में कुछ सवालों के जवाब दे सकते हैं। यहाँ वास्तविक घटनाओं पर आधारित एक परिदृश्य है:
मेरे पास एक बड़ा और जटिल चलना है, और मैं इसे फिर से भरना चाहता हूं। स्पष्टता के लिए, हम सहमत हैं कि एन्यूमरेटर 1 से 100 तक दो बार गिना जाता है। (बेशक, वास्तविक जीवन में, पुनरावृत्त इतना सरल नहीं होगा।)
IEnumerable<int> CountTo100Twice() { int i; for (i = 1; i <= 100; i++) { yield return i; } for (i = 1; i <= 100; i++) { yield return i; } }
जैसा कि हम 101 के आरेख से जानते हैं, हम सामान्य कोड को एक सबरूटीन में डाल सकते हैं और इसे कॉल कर सकते हैं। लेकिन जब मैं ऐसा करता हूं, मुझे एक कंपाइलर त्रुटि मिलती है:
IEnumerable<int> CountTo100Twice() { CountTo100(); CountTo100(); } void CountTo100() { int i; for (i = 1; i <= 100; i++) { yield return i; } }
मैं क्या गलत कर रहा हूँ? मैं "काउंटिंग 100" को एक सबरूटीन में कैसे स्थानांतरित कर सकता हूं और इसे काउंट टू 100100wwice फ़ंक्शन से दो बार कॉल कर सकता हूं?
जैसा कि हमने अभी देखा, पुनरावृत्तियाँ बिल्कुल भी दिनचर्या नहीं हैं। ऊपर प्रस्तुत तकनीक पूरी तरह से काम करेगी अगर हम राज्य मशीनों के बजाय फाइबर से, कहने वाले का निर्माण करें। लेकिन जब से ऑटोमेटा का उपयोग किया जाता है, उपज रिटर्न अभिव्यक्ति "शीर्ष स्तर" पर होनी चाहिए। तो आप दिनचर्या के माध्यम से कैसे पुनरावृत्ति करेंगे?
आप सबरूटीन को एक इट्रेटर बनाते हैं, और फिर मुख्य फ़ंक्शन से परिणाम "खींचते हैं":
IEnumerable<int> CountTo100Twice() { foreach (int i in CountTo100()) yield return i; foreach (int i in CountTo100()) yield return i; } IEnumerable<int> CountTo100() { for (i = 1; i <= 100; i++) { yield return i; } }
व्यायाम: निम्नलिखित स्निपेट पर विचार करें:
foreach (int i in CountTo100Twice()) {
समझाएं कि 150 वें (पचास) कॉल पर क्या होता है ऊपर लूप में MoveNext () को कॉल करें। पुनरावर्ती एल्गोरिदम के लिए इसके निहितार्थों पर विचार करें (जैसे कि पेड़ का पता लगाना)।