2012-01-26 12 views
5

से गुजर रहा हूं, मैं पिछले कुछ महीनों से F # से Haskell से योजना (रैकेट) तक कार्यात्मक भाषाओं के आसपास उछाल रहा हूं। मैंने वास्तव में कभी भी रिकर्सन का उपयोग नहीं किया है, लेकिन हास्केल और इसके पैटर्न मिलान ने वास्तव में मुझे उनसे कम डरने में मदद की। अब जब मैं योजना का उपयोग कर रहा हूं, तो मुझे रिकर्सिव विधियों के लिए डिफ़ॉल्ट लगता है। मैं उत्सुक हूं अगर यह सिर्फ "ओउ चमकदार" के माध्यम से जाने का संकेत है! चरण या यदि रिकर्सन योजना विकास का प्रमुख है।योजना/रैकेट के लिए नया: पुनरावृत्ति का भारी उपयोग जीवन का एक तरीका है या मैं बस एक सामान्य चरण

साइड नोट: जब भी मैं रिकर्सिव विधियों को लिखता हूं तो मैं पूंछ रिकर्सन के लिए शूटिंग कर रहा हूं।

उत्तर

10

मुझे लगता है कि यह निर्भर करता है कि आप किस प्रकार के रिकर्सन के बारे में बात कर रहे हैं।

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

अगला आंख खोलने वाला कितना छोटा है रिकर्सिव कोड का प्रकार जो आप वास्तव में वास्तविक जीवन में लिखेंगे। इसके बजाय, आप और fold जैसे बिल्डिंग ब्लॉक का उपयोग करके - थकाऊ पुनरावृत्ति से बचेंगे - और थकाऊ रिकर्सन दोनों।

इसके अलावा रैकेट में आप शायद map और fold से for/list, for/vector, और for/fold कि दृश्यों पर काम नहीं सिर्फ सूचीबद्ध करता है की तरह "comprehensions" पसंद करते हैं पर पहुँचने के बाद होगा। आप जिस खाद्य श्रृंखला में जा रहे हैं उसे ऊपर रखें।

यह कहकर, कुछ समस्याएं हैं जो आप सबसे अच्छी तरह से हल करेंगे (न केवल "अन्य माध्यमों द्वारा पुनरावृत्ति")। और आंख खोलने वाले नंबर एक में आराम स्तर मिला, मुझे लगता है कि, वहां मदद मिलेगी।

+1

+1 उपयोग करना सीखना - और अंततः अपने स्वयं के रोलिंग - उच्च-आदेश फ़ंक्शंस निश्चित रूप से अगला "ओह चमकदार" है! कदम आपको लेना चाहिए। उसके बाद, शायद मोनैड और तीर। –

3

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

5

नहीं, यह एक चरण नहीं है, यह एक प्रमुख है। रिकर्सन एक ऐसी तकनीक है जो आपको अधिक जटिल समस्याओं को हल करने की अनुमति देती है, अन्यथा आप आसानी से निपटने में सक्षम होंगे-और यहां तक ​​कि उन मामलों में जहां आप एक पुनरावृत्ति समाधान चाहते हैं, यदि आप पहली बार रिकर्सिव एक बनाते हैं तो उस पर पहुंचना आसान होता है।

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

यदि आप आगे बढ़ना चाहते हैं, तो आपको रिक्त चरणों की सामग्री से गणना की पुनरावर्ती संरचना को अलग करके स्पष्ट रिकर्सन से दूर अमूर्त रिक्त स्थान से दूर होना चाहिए। तो उदाहरण के लिए योजना का fold-right "एक रिकर्सिव गणना करने के रूप में देखा जा सकता है जिसमें इस सूची के समान आकार है, इस मामले में रिक्त सूची को मूल स्थिति के रूप में मैप करना, और प्रत्येक cons इस फ़ंक्शन में।" फिर अन्य, अधिक जटिल डेटा संरचनाओं पर गुना है।