यह निर्धारित करने के लिए क्या विचार हैं कि क्या आप किसी समस्या को हल करने के लिए पुनरावृत्ति का उपयोग कर सकते हैं?


10

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

हालांकि, इससे पहले कि आप यह तय कर सकें कि समस्या को हल करने के लिए पुनरावृत्ति का उपयोग करना उचित है या नहीं?


कुछ विचार जो मेरे पास थे:

यदि हम हर बार रुके हुए डेटा पर पुनरावर्तन का उपयोग करते हैं, तो ऐसा लगता है कि यह पुनरावर्तन का उपयोग करने में कोई समस्या नहीं है, क्योंकि सभी डेटा जो 16GB RAM, या यहां तक ​​कि 8TB हार्ड ड्राइव में फिट हो सकते हैं, उन्हें पुनर्संयोजन द्वारा नियंत्रित किया जा सकता है, जो 42 के स्तर तक गहरा है। (इसलिए कोई स्टैक ओवरफ्लो नहीं है (मुझे लगता है कि कुछ वातावरण में, स्टैक 4000 के स्तर तक गहरा हो सकता है, 42 से अधिक हो सकता है, लेकिन साथ ही, यह इस बात पर भी निर्भर करता है कि आपके पास कितने स्थानीय चर हैं, प्रत्येक कॉल स्टैक के रूप में, अधिक मेमोरी पर कब्जा है यदि कई स्थानीय चर हैं, और यह मेमोरी का आकार है, न कि स्तर, जो स्टैक ओवरफ्लो को निर्धारित करता है))।

यदि आप शुद्ध पुनरावृत्ति का उपयोग करके फाइबोनैचि संख्याओं की गणना करते हैं, तो आपको वास्तव में समय की जटिलता के बारे में चिंता करना होगा, जब तक कि आप मध्यवर्ती परिणामों को कैश नहीं करते हैं।

और कैसे 1एक अनंत सटीक पूर्णांक में जोड़ने के बारे में ? शायद यह बहस का मुद्दा है, क्या आप उन संख्याओं के साथ काम करेंगे जो 3000 अंकों की लंबी या 4000 अंकों की लंबी हैं, इतनी बड़ी कि यह एक स्टैक ओवरफ्लो का कारण बन सकती है? मैंने इसके बारे में नहीं सोचा था, लेकिन शायद इसका जवाब नहीं है, हमें पुनरावृत्ति का उपयोग नहीं करना चाहिए, लेकिन सिर्फ एक सादे लूप का उपयोग करना चाहिए, क्योंकि क्या होगा यदि कुछ एप्लिकेशन में, संख्या को 4000 अंकों के लंबे होने की आवश्यकता है, कुछ के लिए जाँच करें संख्या के गुण, जैसे कि संख्या प्रधान है या नहीं।

अंतिम प्रश्न यह है: किसी समस्या को हल करने के लिए पुनरावर्तन का उपयोग करने का निर्णय लेने से पहले क्या विचार हैं?


7
यह वास्तव में सरल है: "क्या समाधान तुच्छ है अगर मैं मान सकता हूं कि थोड़ी छोटी समस्या का समाधान ज्ञात है?"
किलन फ़ॉथ

लेकिन फाइबोनैचि संख्या या 1अनंत सटीक पूर्णांक में जोड़ने के बारे में क्या ? आप कह सकते हैं, हाँ, वे एक छोटे समस्याओं को कम है, लेकिन शुद्ध प्रत्यावर्तन इसके लिए उपयुक्त नहीं है
nonopolarity

आपको यह मददगार लग सकता है - stackoverflow.com/questions/3021/…
किशोर कुंदन

जवाबों:


15

एक विचार यह है कि क्या आपका एल्गोरिथ्म एक सार समाधान या एक व्यावहारिक निष्पादन योग्य समाधान है। पूर्व मामले में, आप जिन विशेषताओं की तलाश कर रहे हैं वे शुद्धता हैं, और आपके लक्षित दर्शकों के लिए समझने में आसानी 1 । बाद के मामले में, प्रदर्शन भी एक मुद्दा है। ये विचार आपकी पसंद को प्रभावित कर सकते हैं।

एक दूसरा विचार (व्यावहारिक समाधान के लिए) यह है कि क्या प्रोग्रामिंग भाषा (या अधिक सख्ती से, इसके कार्यान्वयन) जो आप टेल-कॉल उन्मूलन का उपयोग कर रहे हैं? टेल-कॉल उन्मूलन के बिना, पुनरावृत्ति पुनरावृत्ति की तुलना में धीमी है, और गहरी पुनरावृत्ति स्टैक अतिप्रवाह समस्याओं को जन्म दे सकती है।

ध्यान दें कि (सही) पुनरावर्ती समाधान को एक गैर-पुनरावर्ती समाधान में बदल दिया जा सकता है , इसलिए आपको दो दृष्टिकोणों के बीच एक कठिन विकल्प बनाने की आवश्यकता नहीं है।

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


1 - इसमें लक्ष्य दर्शक की तरह विचार शामिल हैं ... और इसमें व्यावहारिक कोड पढ़ने वाले प्रोग्रामर शामिल हो सकते हैं ... समाधान की एक शैली को दूसरे की तुलना में "अधिक प्राकृतिक" के रूप में देखा जाएगा। "प्राकृतिक" की धारणा व्यक्ति से दूसरे व्यक्ति में भिन्न होगी, यह इस बात पर निर्भर करता है कि उन्होंने प्रोग्रामिंग या एल्गोरिदम कैसे सीखा। (मैं किसी को भी चुनौती देता हूं, जो "प्राकृतिकता" को वस्तुनिष्ठ शब्दों में "स्वाभाविकता" को परिभाषित करने का निर्णय लेने के लिए प्राथमिक मानदंड के रूप में "प्राकृतिकता" का प्रस्ताव करता है; यानी आप इसे कैसे मापेंगे।)


2
कुछ समस्याएं बस पुनरावृत्ति का उपयोग करके अधिक स्वाभाविक रूप से व्यक्त की जाती हैं। उदाहरण के लिए ट्री ट्रैवर्सल।
फ्रैंक हिलमैन

उस बिंदु को संबोधित करने के लिए मेरे उत्तर को अपडेट किया गया,
स्टीफन सी

1
"नैसर्गिकता" के संबंध में: पुनरावृत्ति के बिना ट्री ट्रैवर्सल, उदाहरण के लिए, बड़े, कम सामान्य प्रयोजन कोड का उत्पादन करता है। उदाहरण के लिए पॉलीमोर्फिक कॉल का उपयोग करते हुए पेड़ को पार करने के लिए, पत्ती और समग्र नोड्स के लिए अलग व्यवहार के साथ विचार करें। बिना पुनरावृत्ति के यह संभव नहीं है।
फ्रैंक हिलमैन

1) क्या आपने अभी तक "प्राकृतिक" को परिभाषित करने के लिए मेरी चुनौती को उठाया था? 2) चूंकि स्टैक डेटा-संरचना का उपयोग करके पुनरावृत्ति का अनुकरण करना संभव है, इसलिए ट्री ट्रैवर्सल को भी लागू करना संभव है। यह सबसे कुशल तरीका नहीं हो सकता है ... और यह आपको सबसे अधिक पठनीय कोड नहीं देगा ... लेकिन यह निश्चित रूप से संभव है, और इसे करने के लिए व्यावहारिक है।
स्टीफन C

वैसे, पहली प्रोग्रामिंग भाषा जो मैंने सीखी (फोरट्रान 4) ने पुनरावृत्ति का बिल्कुल समर्थन नहीं किया।
स्टीफन सी

1

C / C ++ प्रोग्रामर के रूप में, मेरा शीर्ष विचार प्रदर्शन है। मेरी निर्णय प्रक्रिया कुछ इस प्रकार है:

  1. कॉल स्टैक की अधिकतम गहराई क्या है? यदि बहुत गहरा है, तो पुनरावृत्ति से छुटकारा पाएं। यदि उथला, 2 पर जाएं।

  2. क्या यह कार्य मेरे कार्यक्रम की अड़चन है? यदि हाँ, तो ३ पर जाएँ। यदि नहीं, तो पुनरावृत्ति रखें। यदि अनिश्चित है, तो एक प्रॉफ़ाइलर चलाएं।

  3. पुनरावर्ती फ़ंक्शन कॉल पर CPU समय का कितना भाग खर्च होता है? यदि फ़ंक्शन कॉल बाकी फ़ंक्शन बॉडी की तुलना में काफी कम समय लेता है, तो पुनरावृत्ति का उपयोग करना ठीक है।


0

हालांकि, इससे पहले कि आप यह तय कर सकें कि समस्या को हल करने के लिए पुनरावृत्ति का उपयोग करना उचित है या नहीं?

स्कीम में फ़ंक्शंस लिखते समय, मुझे बिना ज़्यादा सोचे-समझे री-रिकर्सिव फ़ंक्शंस लिखना स्वाभाविक लगता है।

C ++ में फ़ंक्शन लिखते समय, मैं पुनरावर्ती फ़ंक्शन का उपयोग करने से पहले अपने आप को बहस करते हुए पाता हूं। मैं खुद से जो सवाल पूछता हूं, वे हैं:

  • क्या पुनरावृत्ति एल्गोरिथ्म का उपयोग करके गणना की जा सकती है? यदि हाँ, तो पुनरावृत्त दृष्टिकोण का उपयोग करें।

  • क्या मॉडल के आकार से पुनरावृत्ति की गहराई बढ़ सकती है? मैं हाल ही में एक ऐसे मामले में भाग गया जहां मॉडल के आकार के कारण पुनरावृत्ति की गहराई लगभग 13000 हो गई। मुझे पुनरावृत्त एल्गोरिथ्म पोस्ट-जल्दबाजी का उपयोग करने के लिए फ़ंक्शन को बदलना पड़ा।

    इस कारण से, मैं पुनरावर्ती कार्यों का उपयोग करके ट्री ट्रैवर्सल एल्गोरिथम लिखने की सलाह नहीं दूंगा। आप कभी नहीं जानते कि आपके रन टाइम के माहौल के लिए पेड़ कब बहुत गहरा हो जाता है।

  • क्या पुनरावृति एल्गोरिथ्म का उपयोग करके फ़ंक्शन बहुत जटिल हो सकता है? यदि हाँ, तो पुनरावर्ती फ़ंक्शन का उपयोग करें। मैंने qsortएक पुनरावृत्त दृष्टिकोण का उपयोग करके लिखने की कोशिश नहीं की है, लेकिन मुझे लगता है कि एक पुनरावर्ती फ़ंक्शन का उपयोग करना इसके लिए अधिक स्वाभाविक है।


0

फाइबोनैचि संख्याओं के लिए, भोली "पुनरावृत्ति" पूरी तरह से बेवकूफ है। ऐसा इसलिए है क्योंकि यह एक ही सबप्रोब्लेम को बार-बार हल किया जा रहा है।

वास्तव में फाइबोनैचि संख्याओं का एक तुच्छ परिवर्तन है जहां पुनरावृत्ति बहुत कुशल है: एक संख्या n fib 1 को देखते हुए, दोनों फ़ाइबर (n) और फ़ाइबर (n-1) की गणना करें। तो आपको एक फ़ंक्शन की आवश्यकता होती है जो दो परिणाम देता है, इस फ़ंक्शन को fib2 कहते हैं।

कार्यान्वयन काफी सरल है:

function fib2 (n) -> (fibn, fibnm1) {
    if n ≤ 1 { return (1, 1) }
    let (fibn, fibnm1) = fib2 (n-1)
    return (fibn + fibnm1, fibn)
}

क्या आपको लगता है कि आप एक सामान्य भाषा में कार्यक्रम लिख सकते हैं? और आपकी fib2संख्याओं की एक जोड़ी लौटाती है, और आपका fib2()इंटरफ़ेस फिट नहीं होता है fib(), जो एक नंबर दिया गया है, एक नंबर लौटाता है। ऐसा लगता है fib(n)कि आपका वापस लौटना है fib2(n)[0]लेकिन कृपया विशिष्ट हो
गैरबराबरी
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.