क्या सभी पुनरावर्ती कार्यों को पुनरावृत्तियों के साथ कोडित किया जा सकता है? [बन्द है]


10

पुनरावर्तन के क्या लाभ हैं?

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

क्या कुछ पुनरावर्ती कार्य का पुनरावृत्त संस्करण होना संभव है?



जवाबों:


10

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

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

मेरा सुझाव है कि आप एक संकलक पुस्तक का अध्ययन करें कि यह आमतौर पर मशीन कोड में कैसे लागू किया जाता है।


मैं समझ गया। तो, क्या फायदा होगा पुनरावृत्ति? सादगी?
ऑस्करराइज

2
@OscarRyz: हाँ, और यह अधिक सुरुचिपूर्ण है।
माइकल के

@OscarRyz, जिस तरह से मैंने वर्णन किया है वह पुनरावृत्ति है। यह सिर्फ देशी सीपीयू-निर्देशों के साथ नहीं किया गया है। इसे मैन्युअल रूप से करना आपको चीजों को करने की अनुमति देता है - जैसे समानांतरकरण - जो मूल निर्देशों के लिए बुरी तरह से मैप करता है।

15

पुनरावृत्ति अक्सर पुनरावृत्ति की तुलना में चीजों को देखने का एक अधिक प्राकृतिक तरीका है। उदाहरण के लिए, एक द्विआधारी पेड़ के इनवर्टर ट्रैवर्सल पर विचार करें: inorder(left); process(); inorder(right);एक स्टैक को स्पष्ट रूप से बनाए रखने की तुलना में बहुत सरल है।

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

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

टेल-पुनरावर्ती कार्यों को आसानी से छोरों में अनुवादित किया जा सकता है, और स्टैक की आवश्यकता नहीं है, लेकिन यह एक विशेष मामला है।


8
मैं कहूंगा कि सही हमेशा उपवास से बेहतर है। कोड जो गलत काम बहुत जल्दी करता है वह किसी के लिए बहुत अच्छा नहीं है।
मेसन व्हीलर

1
लेकिन क्या होगा अगर आप उस गलत काम को वास्तव में जल्दी कर सकते हैं ?!
रेशनलगीक

1
@jkohlhepp - मैं किसी भी समस्या को तुरंत हल कर सकता हूं। इसका उत्तर है 0.
स्व पर ध्यान दें -

2
एक स्पष्ट स्टैक के बजाय पुनरावृत्ति का उपयोग करना अधिक कुशल हो सकता है - ढेर आवंटन, संभव स्मृति विखंडन और संभावित स्थानीय मुद्दों की आवश्यकता से बचना। हालाँकि, "दाईं ओर आम तौर पर तेजी से बेहतर होता है", उन मामलों में अतिप्रवाह ढेर हो जाता है जिन्हें आपके सॉफ़्टवेयर को संभालने की आवश्यकता होती है, ताकि आपका कोड टूट जाए। आमतौर पर, समस्या के मामले आसानी से सामने आते हैं - (यथोचित) संतुलित पेड़ पर पुनरावृत्ति ठीक है, लेकिन एक ऐसे पेड़ पर पुनरावृत्ति जो बहुत असंतुलित हो सकती है, या किसी लिंक की गई सूची पर, सी। वर्सेस जैसी भाषा में एक गंभीर बग हो सकती है। , यह सरल परीक्षण से बच सकता है, और केवल तब ही क्रैश हो सकता है जब वास्तविक के लिए तैनात किया गया हो।
स्टीव 314

1
मुझे लगता है कि आप सभी समझते हैं कि मेसन का मतलब क्या था और केवल इसके मज़ाक के लिए मजाक बना रहे थे। बेशक एक धीमी गति से सही कार्यक्रम तेजी से गलत कार्यक्रम की तुलना में अधिक उपयोगी है।
जियोर्जियो

4

पुनरावर्तन के क्या लाभ हैं?

हनोई समस्या के टावर्स को चलने के लिए हल करने का प्रयास करें। एक बार जब आप हार मान लेते हैं, तो पुनरावृत्त समाधान पर एक नज़र डालें और पुनरावर्ती से तुलना करें। कौन सा सरल है?

क्या कुछ पुनरावर्ती कार्य का पुनरावृत्त संस्करण होना संभव है?

हाँ, सिद्धांत रूप में। हालाँकि कई समस्याओं के लिए, जिनमें बहुत ही सामान्य कार्य शामिल हैं, जैसे कि पेड़ की कटाई, पुनरावर्ती समाधान पुनरावृत्तियों की तुलना में बहुत सरल और अधिक सुरुचिपूर्ण हैं।


3

पुनरावर्तन के क्या लाभ हैं?

सादगी। टेल-कॉल ऑप्टिमाइज़ेशन के बिना यह निश्चित रूप से अधिक संसाधन (स्टैक) लेता है, लेकिन आप deltreeजावा में पुनरावृत्ति के बिना कैसे लागू करेंगे, कहते हैं ? मोड़ यह है कि delete()निर्देशिकाओं को तभी हटा सकते हैं जब वे खाली हों; यहाँ पुनरावृत्ति के साथ है:

deltree(File fileOrDirectory) {
    if (fileOrDirectory.isDirectory()) {
        for (File subFileOrDirectory : fileOrDirectory.listFiles()) {
            deltree(subFileOrDirectory);
        }
    }
    fileOrDirectory.delete();
}

1
एक स्टैक के साथ, जैसा कि अन्य उत्तरों द्वारा उल्लेख किया गया है।
निकोल

हां, लेकिन यह कितना सरल है? -)
जूनास पुलकका

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

0

मुझे विश्वास है कि प्रत्यावर्तन उन उपकरण है कि एक प्रोग्रामर में से एक है चाहिए जीना है। पुनरावृत्ति के साथ आप अपने एल्गोरिदम को "सोच सकते हैं" और उन्हें हल कर सकते हैं जिस तरह से आपने इसके बारे में सोचा था। लेकिन, मुझे आपको चेतावनी देनी चाहिए, हर कोई इस बारे में बात कर रहा है कि कोड कितना सुंदर है और कितनी सरलता कोड में लाता है, इसके बारे में मेरे पास कहने के लिए कुछ चीजें हैं:

  1. सबसे पहले, एक एल्गोरिथ्म के "पुनरावर्ती तरीके" को समझना आसान नहीं है। एक फैक्टरियल (एन!) या हनोई टावर्स की तरह कुछ का निर्माण करना सिर्फ हिमशैल का टिप है, और नीचे तक पहुंचने के लिए एक लूओंग समय की आवश्यकता होती है।
  2. यह मत सोचो कि पुनरावृत्ति आपके कोड में केवल सादगी लाती है, कभी-कभी, पुनरावृत्ति तरीका बदसूरत और गड़बड़ है, लेकिन लागत प्रभावी है (फाइबोनैचि समस्या के पुनरावर्ती समाधान पर गौर करें)

उन चीजों को ध्यान में रखते हुए, पुनरावृत्ति सीखें! यह मज़ेदार है, जटिल है और यह आपके दिमाग को तोड़ देगा!, लेकिन आप खुद को इसे प्यार करते हुए पाएंगे।

शुभकामनाएँ!

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.