2013-06-22 3 views
7

SICP Section 1.2.1 में लेखक नीचे इस तरह के एक कोड उदाहरण देकर कैसे भाज्य समस्या को हल करने सतत प्रक्रिया का उपयोग कर को दिखाने के लिए:SICP पुनरावर्ती प्रक्रिया सतत प्रक्रिया बनाम: एक पुनरावर्ती प्रक्रिया का उपयोग कर उत्पन्न करने के लिए एक सतत प्रक्रिया

(define (factorial n) 
    (fact-iter 1 1 n)) 
(define (fact-iter product counter max-count) 
    (if (> counter max-count) 
     product 
     (fact-iter (* counter product) 
       (+ counter 1) 
       max-count))) 

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

मुझे समझ में नहीं आता कि लेखक का क्या अर्थ है। एक पुनरावर्ती प्रक्रिया और एक पुनरावर्ती प्रक्रिया के बीच क्या अंतर है? और उन्होंने एक पुनरावृत्ति प्रक्रिया उत्पन्न करने के बाद एक पुनरावर्ती प्रक्रिया क्यों कहा?

उत्तर

10

रिकर्सिव प्रक्रिया को कॉलर की स्थिति को बनाए रखने की आवश्यकता है जबकि रिकर्सिव कॉल प्रगति पर है। उदाहरण के लिए, यदि आप ने लिखा है:

(define (fact-recurse n) 
    (if (< n 2) 
     1 
     (* n (fact-recurse (- n 1))))) 

बाहरी कॉल n याद है और वापस जाने के लिए इससे पहले कि यह गुणा प्रदर्शन कर सकते हैं आंतरिक कॉल के लिए इंतजार करना पड़ता है। यदि आप (fact-recurse 10) पर कॉल करते हैं तो कार्य 9 रिक्त गुणांक लंबित होगा जब फ़ंक्शन इसके रिकर्सन के अंत तक पहुंच जाएगा।

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

के बाद से बाहरी कॉल के मापदंडों को अब जरूरत है, पुनरावर्ती कॉल कार्य में अनुवाद किया जा सकता है:

(set! product (* counter product)) 
(set! counter (+ counter 1) 
(set! max-count max-count) 

और फिर यह सिर्फ प्रक्रिया की शुरुआत करने के लिए कूदता है।

+0

समझ गया, बहुत बहुत धन्यवाद। – zuozuo

+0

यह वह जगह है जहां एइल कॉल ऑप्टिमाइज़ेशन हो सकता है, जहां स्टैक की आवश्यकता नहीं है और इसे छोड़ दिया जा सकता है, सही? –

+1

@ जोनसुरेल बिल्कुल। उद्धृत सामग्री यह बता रही है कि पूंछ कॉल अनुकूलन कैसे होता है। – Barmar

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