6

मुझे पता है कि एक पूंछ रिकर्सिव एल्गोरिदम written out in this SO answer के रूप में क्या है। हालांकि मैं इस video of quick sort algorithm from MIT और 18:30 सेकंड में जा रहा हूं, प्रोफेसर का कहना है कि यह पूंछ रिकर्सिव एल्गोरिदम है। मैं कनेक्ट करने में असफल रहा कि यह कैसे पूंछ रिकर्सिव है। हम रिकर्सन के किसी भी चरण में गणना नहीं कर रहे हैं या हम हैं? क्या आप समझा सकते हैं कि इसे पूंछ रिकर्सिव एल्गोरिदम के उदाहरण के रूप में क्यों उद्धृत किया गया है। कृपया आधार पर अपना उत्तर आधार दें कि मुझे पता है कि एक रिकर्सिव एल्गोरिदम क्या है। वह हिस्सा जो मुझे स्पष्ट नहीं है, उसे पूंछ रिकर्सिव क्यों कहा जाता है?त्वरित प्रकार को पूंछ रिकर्सिव एल्गोरिदम क्यों कहा जाता है?

+2

आप पढ़ सकते हैं किया था? – Andrey

+2

@ एंड्रे हां मैंने किया लेकिन मुझे एसओ में जवाब मिला कि मैंने समझने के लिए आसान और स्पष्ट होने के लिए जोड़ा है। – Geek

+0

संभावित डुप्लिकेट [पूंछ-रिकर्सन क्या है?] (Http://stackoverflow.com/questions/33923/what-is-tail-recursion)। एक बार जब आप पूंछ रिकर्सिव की परिभाषा देखते हैं, तो 17:28 पर एल्गोरिदम की परिभाषा, यह स्पष्ट है कि यह पूंछ रिकर्सिव है, क्योंकि रिकर्सिव चरण का वापसी मूल्य स्वयं को कॉल का वापसी मूल्य है। –

उत्तर

1

रिकर्सिव फ़ंक्शन का पहला चरण विभाजन है। और फिर, अंतिम चरण के रूप में, आप दो विभाजनों पर रिकर्सिव फ़ंक्शन को कॉल करते हैं।

विकिपीडिया से

:

कंप्यूटर विज्ञान में, एक पूंछ कॉल एक सबरूटीन कॉल कि अपनी अंतिम कार्रवाई के रूप में एक और प्रक्रिया के अंदर होता है; यह वैल्यू का उत्पादन कर सकता है जिसे तुरंत कॉलिंग प्रक्रिया द्वारा वापस कर दिया जाता है।

7

पूंछ रिकर्सन चरणों में गणना करने के बारे में नहीं है। यह "कॉल स्टैक के निर्माण के बिना रिकर्सन का मूल्यांकन किया जा सकता है।" What is tail recursion? द्वारा दिया गया उदाहरण यह एक विशेष मामला है। आप और अधिक गहराई से उदाहरण देखें, तो क्या आप पा सकते हैं कि

def recsum(x): 
if x==1: 
    return x 
else: 
    return x+recsum(x-1) 

1) उपरोक्त कोड को सफलतापूर्वक चलाने के लिए, आप कॉल स्टैक का निर्माण करने की जरूरत है। लेकिन,

def tailrecsum(x,running_total=0): 
    if x==0: 
    return running_total 
    else: 
    return tailrecsum(x-1,running_total+x) 

2) उपरोक्त कोड को चलाने के लिए, आप running_total की वजह से कॉल स्टैक का निर्माण करने की जरूरत नहीं है। बस "मूल कॉल" के लिए कॉल स्टैक बनाएं और रिकर्सन के लिए, कॉल स्टैक बनाने की कोई आवश्यकता नहीं है, क्योंकि इस फ़ंक्शन का मूल्यांकन करने के लिए आवश्यक स्थिति run_total में संग्रहीत है।

और, त्वरित प्रकार के बारे में, मुझे लगता है कि प्रोफेसर का शायद यह अर्थ था कि त्वरित-प्रकार को पूंछ-भर्ती "उपयोग" द्वारा अनुकूलित किया जा सकता है। Qsort() के दो शाखाओं के हिस्सों के लिए, हम एक तरफ पूंछ-पुनरावर्तन का उपयोग कर सकते हैं जिसमें उच्च वस्तुएं हैं (पिवट स्थिति के आधार पर)।

enter image description here

+2

क्या आप इसे आगे बताने के लिए अपने उत्तर में कॉल स्टैक डाल सकते हैं। मेरे लिए ऐसा लगता है कि आपको दोनों प्रक्रियाओं में कॉल स्टैक बनाने की आवश्यकता है। tailrecsum पूंछ रिकर्सिव कॉल कॉल tailrecsum कहते हैं .... तो कॉल ढेर का निर्माण हो रहा है ... क्या यह नहीं है? – Geek

+1

यह मेरी पिछली टिप्पणी से निरंतरता है ... संकलक स्टैक के निर्माण के बिना एक रिकर्सिव कॉल की गणना कैसे कर सकता है? "कॉल स्टैक बनाने" से आपका क्या मतलब है? – Geek

+2

@ गीक: मैं इस विषय में सिर्फ एक नौसिखिया हूं, और मैं "कंप्यूटर प्रोग्राम की संरचना और व्याख्या" (एसआईसीपी) पढ़ने की प्रक्रिया में हूं, जो मुफ्त ऑनलाइन उपलब्ध है; पूंछ-पुनरावर्तन की अवधारणा विषय "रैखिक रिकर्सन बनाम पुनरावृत्ति" विषय से घनिष्ठ रूप से संबंधित है। एसआईसीपी के बारे में यहां बहुत कुछ कहना है: http://mitpress.mit.edu/sicp/full-text/book/book-Z-H-11.html#%_sec_1.2.1। एसआईसीपी से यह लिंक यह स्पष्ट रूप से बताता है। – favq

4

Quicksort की विकि पृष्ठ पर एक नजर डालें। पुनरावर्ती

function quicksort(array, 'left', 'right') 

    // If the list has 2 or more items 
    if 'left' < 'right' 

     // See "Choice of pivot" section below for possible choices 
     choose any 'pivotIndex' such that 'left' ≤ 'pivotIndex' ≤ 'right' 

     // Get lists of bigger and smaller items and final position of pivot 
     'pivotNewIndex' := partition(array, 'left', 'right', 'pivotIndex') 

     // Recursively sort elements smaller than the pivot 
     quicksort(array, 'left', 'pivotNewIndex' - 1) 

     // Recursively sort elements at least as big as the pivot 
     quicksort(array, 'pivotNewIndex' + 1, 'right') 

Tail recursion की परिभाषा के अनुसार पूंछ का एक संस्करण है, quicksort के अंतिम विधि कॉल ही है कि पूंछ प्रत्यावर्तन है,। लेकिन कुछ अन्य कार्यान्वयन पूंछ रिकर्सिव नहीं हैं।

quicksort(left) + pivot + quicksort(right) 

क्योंकि quicksort में अंतिम कार्रवाई है sorted_left + pivot + sorted_right है कि अपने पिछले प्रश्न से विकिपीडिया लेख

+2

क्या अन्य इसकी सटीकता की पुष्टि कर सकते हैं? –

संबंधित मुद्दे