यह उस प्रोग्रामिंग भाषा में अधिक धाराप्रवाह बनने के लिए एक अच्छा व्यायाम है जिसे आप सीखने के लिए अर्थ देते हैं, लेकिन केवल हल्के ढंग से छेड़छाड़ करते हैं। इसमें ऑब्जेक्ट के साथ काम करना, क्लोजर का उपयोग करना या अनुकरण करना और टाइप सिस्टम को स्ट्रेच करना शामिल है।
आपका कार्य आलसी सूचियों को प्रबंधित करने के लिए कोड लिखना है, फिर फाइबोनैचि संख्याओं को उत्पन्न करने के लिए इस एल्गोरिथम को लागू करने के लिए इसका उपयोग करें:
कोड के नमूने हास्केल में हैं
let fibs = 0 : 1 : zipWith (+) fibs (tail fibs)
in take 40 fibs
परिणाम:
[0,1,1,2,3,5,8,13,21,34,55,89,144,233,377,610,987,1597,2584,4181,6765,10946,17711,28657,46368,75025,121393,196418,317811,514229,832040,1346269,2178309,3524578,5702887,9227465,14930352,24157817,39088169,63245986]
आपकी आलसी सूची कार्यान्वयन को इन दिशानिर्देशों को पूरा करना चाहिए:
- एक सूची नोड तीन चीजों में से एक है:
- शून्य - खाली सूची।
[]
- विपक्ष - एक एकल आइटम, शेष वस्तुओं की सूची के साथ जोड़ा गया:
1 : [2,3,4,5]
(:
हास्केल में कंस ऑपरेटर है) - थंक - एक आस्थगित अभिकलन जो जरूरत पड़ने पर एक सूची नोड का उत्पादन करता है।
- शून्य - खाली सूची।
- यह निम्नलिखित कार्यों का समर्थन करता है:
- नील - एक खाली सूची का निर्माण।
- cons - एक कंस सेल का निर्माण।
- थंक - एक थंक का निर्माण करते हैं, एक ऐसा फ़ंक्शन दिया जाता है जो कोई तर्क नहीं देता है और एक निल या विपक्ष लौटाता है।
- बल - एक सूची नोड को देखते हुए:
- यदि यह एक निल या विपक्ष है, तो इसे वापस कर दें।
- यदि यह एक थंक है, तो निल या कॉन्स पाने के लिए इसके फ़ंक्शन को कॉल करें। उस नील या विपक्ष के साथ ठग को बदलें, और इसे वापस करें।
नोट: थंक को उसके मजबूर मान के साथ बदलना "आलसी" की परिभाषा का एक महत्वपूर्ण हिस्सा है । यदि यह चरण छोड़ दिया जाता है, तो ऊपर फाइबोनैचि एल्गोरिथ्म बहुत धीमा हो जाएगा।
- खाली - देखें कि क्या एक सूची नोड निल है (इसे मजबूर करने के बाद)।
- सिर (उर्फ "कार") - एक सूची का पहला आइटम प्राप्त करें (या यदि यह नील है तो एक फिट फेंक दें)।
- पूंछ (उर्फ "सीडीआर") - एक सूची के प्रमुख के बाद तत्वों को प्राप्त करें (या यदि यह नील है तो एक फिट फेंक दें)।
- zipWith - एक बाइनरी फ़ंक्शन (जैसे
(+)
) और दो (संभवतः अनंत) सूचियों को देखते हुए , फ़ंक्शन को सूचियों के संबंधित आइटम पर लागू करें। उदाहरण:
zipWith (+) [1,2,3] [1,1,10] == [2,3,13]
- ले - एक संख्या एन और एक (संभवतः अनंत) सूची को देखते हुए, सूची के पहले एन आइटम को पकड़ो।
- प्रिंट - किसी सूची में सभी आइटम प्रिंट करें। लंबी या अनंत सूची दिए जाने पर इसे बढ़ाकर काम करना चाहिए।
fibs
अपनी परिभाषा में खुद का उपयोग करता है। आलसी पुनरावृत्ति की स्थापना एक कठिन चाल है; आपको ऐसा कुछ करने की आवश्यकता होगी:- के लिए एक ठिकाना आवंटित करें
fibs
। इसे अभी के लिए डमी अवस्था में छोड़ दें। - थंक फ़ंक्शन को परिभाषित करें, जो करने के लिए एक संदर्भ पर निर्भर करता है
fibs
। - इसके कार्य के साथ थन को अपडेट करें।
आप एक फ़ंक्शन को परिभाषित करके इस प्लंबिंग को छुपाना चाह सकते हैं,
fix
जो लिस्ट-रिटर्न फ़ंक्शन को अपने स्वयं के रिटर्न मूल्य के साथ कहता है। एक छोटी झपकी लेने पर विचार करें ताकि यह विचार अंदर सेट हो सके।- के लिए एक ठिकाना आवंटित करें
बहुरूपता (किसी भी प्रकार की वस्तुओं की सूचियों के साथ काम करने की क्षमता) की आवश्यकता नहीं है, लेकिन देखें कि क्या आप ऐसा करने का कोई तरीका खोज सकते हैं जो आपकी भाषा में मुहावरा है।
- स्मृति प्रबंधन के बारे में चिंता मत करो। यहां तक कि कचरा संग्रह वाली भाषाओं में भी उन वस्तुओं को ले जाने की प्रवृत्ति होती है, जिन्हें आप फिर कभी उपयोग नहीं करेंगे (उदाहरण के लिए कॉल स्टैक पर), इसलिए आश्चर्यचकित न हों यदि आपका कार्यक्रम एक अनंत सूची को पार करते हुए स्मृति को लीक करता है।
अपनी भाषा के विवरणों को समायोजित करने के लिए या आलसी सूचियों के लिए वैकल्पिक तरीकों का पता लगाने के लिए इन दिशानिर्देशों से थोड़ा विचलित होने के लिए स्वतंत्र महसूस करें।
नियम:
- ऐसी भाषा चुनें जिसे आप अच्छी तरह से नहीं जानते हैं। मुझे इसकी आवश्यकता नहीं है, इसलिए "सम्मान-प्रणाली" टैग। हालांकि, मतदाता आपके इतिहास को यह देखने के लिए जांच सकते हैं कि आप किन भाषाओं में पोस्ट कर रहे हैं।
सब कुछ करने के लिए अपनी भाषा की अंतर्निहित आलसी सूची समर्थन का उपयोग न करें। कुछ पर्याप्त या कम से कम दिलचस्प पोस्ट करें।
हास्केल बहुत बाहर है। जब तक आप ऐसा कुछ नहीं करते हैं:
data List a = IORef (ListNode a) data ListNode a = Nil | Cons !a !(List a) | Thunk !(IO (ListNode a))
नोट: हास्केल का गैर-सख्त मूल्यांकन ऑफ-लिमिट्स नहीं है, लेकिन आपके आलसी सूची कार्यान्वयन को सीधे इसकी क्षमता प्राप्त नहीं करनी चाहिए। वास्तव में, यह एक कुशल, विशुद्ध रूप से कार्यात्मक समाधान देखना दिलचस्प होगा जिसमें आलस्य की आवश्यकता नहीं है।
अजगर:
- Itertools का उपयोग न करें।
- जेनरेटर ठीक हैं, लेकिन आप उनका उपयोग करते हैं, आपको मजबूर मूल्यों को याद करने का कोई तरीका खोजना होगा।
zipWith (+) [1,2,3,4,5] [0,0,0] == [1,2,3]
। हालाँकि, ऊपर दिए गए फाइबोनैचि एल्गोरिथ्म के लिए यह कोई मायने नहीं रखता है, क्योंकि zipWith दोनों तर्क अनंत सूचियाँ हैं।
zipWith
अलग-अलग लंबाई की दो सूचियों पर कॉल करते समय व्यवहार कैसा होना चाहिए ?