विदेशी मुद्रा पर पैसे कैसे बनाने के लिए?

फाइबोनैचि चैनल

फाइबोनैचि चैनल

प्रभावी प्रोग्रामिंग। भाग 1: पुनरावृत्तियों और जनरेटर

जावास्क्रिप्ट वर्तमान में कई साइटों के संस्करणों के अनुसार सबसे लोकप्रिय प्रोग्रामिंग भाषा है (उदाहरण के लिए, जीथब)। उसी समय, क्या यह सबसे उन्नत फाइबोनैचि चैनल या पसंदीदा भाषा है? इसमें उन निर्माणों का अभाव है जो अन्य भाषाओं के लिए अभिन्न अंग हैं: एक व्यापक मानक पुस्तकालय, अपरिवर्तनीयता, मैक्रोज़। लेकिन इसमें एक विस्तार यह है कि, मेरी राय में, पर्याप्त ध्यान नहीं मिलता है - जनरेटर।

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

यह पहला, पायलट हिस्सा है: Iterators और जेनरेटर।

iterators

तो, एक इटैटर एक इंटरफ़ेस है जो डेटा को अनुक्रमिक एक्सेस प्रदान करता है।

जैसा कि आप देख सकते हैं, परिभाषा डेटा या मेमोरी संरचनाओं के बारे में कुछ नहीं कहती है। वास्तव में, अपरिभाषित के एक अनुक्रम को किसी भी मेमोरी स्पेस को उठाए बिना एक पुनरावृत्त के रूप में दर्शाया जा सकता है।

मैं इस प्रश्न का उत्तर देने के लिए पाठक को सुझाव देता हूं: एक सरणी एक पुनरावृत्ति है?

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

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

इसके अलावा, एक पुनरावृत्त एक बाहरी चैनल से डेटा प्राप्त करने का प्रतिनिधित्व कर सकता है, जैसे कि वेबसोकेट।

जावास्क्रिप्ट में, एक इटरेटर कोई भी ऑब्जेक्ट होता है जिसमें एक अगला () तरीका होता है जो फ़ील्ड वैल्यू के साथ एक स्ट्रक्चर लौटाता है - इटरेटर का वर्तमान मूल्य और किया गया - अनुक्रम के अंत का संकेत करने वाला एक झंडा (यह कन्वेंशन ईसीएमस्क्रिप्ट लैंग्वेज स्टैंडर्ड में वर्णित है )। ऐसी वस्तु Iterator इंटरफ़ेस को लागू करती है। आइए इस प्रारूप में पिछले उदाहरण को फिर से लिखें:

जावास्क्रिप्ट में एक Iterable इंटरफ़ेस भी है - यह एक ऐसी वस्तु है जिसमें @@ itter विधि है (यह स्थिरांक Symbol.iterator के रूप में उपलब्ध है) जो पुनरावृति देता है। ऐसे इंटरफ़ेस को लागू करने वाली वस्तुओं के लिए, ऑपरेटर ट्रैवर्सल उपलब्ध है for..of । आइए हमारे उदाहरण को एक बार फिर से लिखें, केवल इस बार Iterable कार्यान्वयन के रूप में:

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

जेनरेटर

जनरेटर पुनरावृत्तियों के विकास में अगला चरण बन गए। वे फ़ंक्शन मान की तरह पुनरावृत्त मानों को वापस करने के लिए सिंटैक्टिक चीनी प्रदान फाइबोनैचि चैनल करते हैं। एक जनरेटर एक फ़ंक्शन है (एक तारांकन के साथ घोषित: फ़ंक्शन * ) जो एक पुनरावृत्ति देता है। इस मामले में, इटरेटर स्पष्ट रूप से वापस नहीं है; कार्यों केवल इटरेटर का उपयोग करने का मान उपज बयान । जब फ़ंक्शन अपने निष्पादन को पूरा करता है, तो इटिटर को पूर्ण माना जाता है (अगली विधि के लिए बाद की कॉल के परिणामों को आवश्यक रूप से किया जाएगा)

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

जब NaturalRowGenerator कहा जाता है, तो एक इट्रेटर बनाया जाता है।

इसके अलावा, जब हम अगली विधि को पहले तीन बार कहते हैं, या, हमारे मामले में, हम लूप के माध्यम से पुनरावृति करते हैं, तो पैदावार विवरण के बाद कर्सर को तैनात किया जाता है।

और अगले सभी कॉल के लिए अगले और लूप से बाहर निकलने के बाद, जनरेटर अपने निष्पादन को पूरा करता है और, अगले कॉलिंग के परिणाम होंगे

एक पुनरावृत्ति करने के लिए मापदंडों को पारित करना

आइए कल्पना करें कि हमें वर्तमान काउंटर को रीसेट करने की क्षमता को जोड़ने की आवश्यकता है और शुरुआत से प्राकृतिक संख्याओं के अपने इटेरेटर तक गिनती शुरू करें।

यह स्पष्ट है कि स्व-लिखित पुनरावृत्ति में इस तरह के पैरामीटर को कैसे संभालना है, लेकिन जनरेटर के बारे में क्या?

यह पता चला है कि जनरेटर गुजरने वाले पैरामीटर का समर्थन करते हैं!

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

उपज के बयान से लौटते समय यह कर्सर जम गया। अगली कॉल के लिए अगले पर, फ़ंक्शन को दिया गया मान रीसेट चर का मान सेट करेगा। मूल्य पहली पहली कॉल में अगले अंत तक कहाँ पारित हुआ है, क्योंकि अभी तक उपज के लिए कॉल नहीं आया है? कहीं भी नहीं! यह कचरा संग्रहकर्ता की विशालता में विलीन हो जाएगा। यदि आपको जनरेटर के लिए कुछ प्रारंभिक मूल्य पास करने की आवश्यकता है, तो यह जनरेटर के तर्कों का उपयोग करके किया जा सकता है। उदाहरण:

निष्कर्ष

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

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

रेटिंग: 4.11
अधिकतम अंक: 5
न्यूनतम अंक: 1
मतदाताओं की संख्या: 794
उत्तर छोड़ दें

आपका ईमेल पता प्रकाशित नहीं किया जाएगा| अपेक्षित स्थानों को रेखांकित कर दिया गया है *