पुनरावर्ती फ़ंक्शन कॉल में वापसी विवरण का कारण


14

मेरे मन में बस एक शंका थी। निम्नलिखित सबरूटीन (उदाहरण के लिए, सूची में एक तत्व को खोजने के लिए) के अंत में एक रिटर्न स्टेटमेंट है:

list *search_list(list *l, item_type x) {
  if (l == NULL) return(NULL);
  if (l->item == x)
    return(l);
  else
    return( search_list(l->next, x) );
}

मुझे अंत में रिटर्न स्टेटमेंट का महत्व नहीं मिल सकता है (यानी रिटर्न सर्च_लिस्ट (एल-> नेक्स्ट, एक्स))। यदि स्टैक मॉडल का उपयोग करके कोई भी इस अवधारणा को समझा सकता है, तो यह वास्तव में सहायक होगा।


यदि सूची का पहला शब्द परिणाम नहीं है, तो बाकी सूची के माध्यम से खोजें । यही आखिरी returnकरता है।
जियोर्जियो

@ जियोर्जियो, केवल एक फ़ंक्शन कॉल ही पर्याप्त क्यों नहीं होगा, इससे पहले एक वापसी की आवश्यकता क्यों है?
user1369975

7
क्योंकि आपको फ़ंक्शन द्वारा लौटाए गए मान को वापस करने की आवश्यकता है
एस्लेइजा

7
डाउनवोटर्स: कृपया महसूस करें कि, ओपी की पृष्ठभूमि पर निर्भर करता है, यह बिल्कुल स्पष्ट नहीं है कि क्या returnकरता है। वास्तव में, कार्यात्मक भाषाओं में (और कुछ मिश्रित, जैसे स्काला) return की आवश्यकता नहीं है : पुनरावर्ती फ़ंक्शन का मान इसकी अंतिम अभिव्यक्ति का मूल्य है। बस search_list(l->next, x)बिना लेखन के returnस्काला में काम किया होता! returnकथन का अर्थ केवल अनिवार्य पृष्ठभूमि वाले प्रोग्रामर के लिए स्पष्ट है।
एंड्रेस एफ।

ओपी: क्या आपका कोड स्निपेट सी में लिखा गया है?
एंड्रेस एफ।

जवाबों:


19

एक वापसी विवरण वर्तमान फ़ंक्शन के कॉल-फ़्रेम के तत्काल कॉलर पर एक मान वापस करता है। पुनरावृत्ति के मामले में, यह तत्काल कॉलर उसी फ़ंक्शन का एक और आह्वान हो सकता है।

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

अप्रयुक्त रिटर्न मान मानने पर चुपचाप त्याग दें, अगर आपने इस तरह कोड लिखा था:

list *search_list(list *l, item_type x) {
  if (l == NULL) return(NULL);
  if (l->item == x)
    return(l);
  else
    search_list(l->next, x); // no return!
}

तब search_listकेवल एक खाली सूची (NULL) के लिए एक परिभाषित मान लौटाएगा या यदि पहला आइटम आपके द्वारा खोजे जा रहे मूल्य से मेल खाता है। जैसे ही फ़ंक्शन पुनरावर्ती कॉल में जाता है, आपको नहीं पता कि परिणाम क्या होगा, क्योंकि पुनरावर्ती कॉल का परिणाम खारिज हो जाता है।

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


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

1

दो चीज़ें; मामले में पूरी सूची को वापस करते हुए कि आप जिस "x" को खोज रहे हैं वह जरूरी नहीं है कि पुनरावृत्ति का उपयोग करते हुए वारंट हो, लेकिन यह एक तरफ, निम्नलिखित पर विचार करें:

मान लें कि आप X = "दिसंबर" का मान मांग रहे हैं, और आपकी सूची वर्ष के महीनों का संख्यात्मक मूल्य है, अगले महीने के लिए एक सूचक है, और सूची में l-> आइटम बाहर वर्तनी नाम हैं महीने। (जनवरी, फरवरी, ..., दिसंबर)। संभावित परिणामों के लिए आपको तीन रिटर्न चाहिए। यदि सूची में वह X नहीं है जो आप देख रहे हैं, तो पहले, रिटर्न (NULL) की आवश्यकता है। दूसरा, (रिटर्न (एल)) इस मामले में सूची लौटाता है, जिससे आपको पता चलता है कि आपको अपना "x" मिल गया है। अंतिम वह जगह है जहां स्टैक मॉडल खेलने में आता है। फ़ंक्शन की लगातार कॉल ने स्थानीय चर (विशेष रूप से, l-> आइटम के) को इस तरह अपडेट किया होगा:

1: l->item = January
   returns search_list(l->next, x)
2: l->item = February
   returns search_list(l->next, x)
3-11: March, April, May, June, July, August, September, October, November
   all return search_list(l->next, x)
12: l->item = December
  This matches the second if() and returns your list, letting you know you found your search item.

, आपके चित्रण के लिए धन्यवाद, लेकिन वास्तव में अंतिम रिटर्न का उपयोग नहीं करते हैं
user1369975

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