निम्नलिखित tail recursion modulo cons अनुकूलन का कार्यान्वयन है, जिसके परिणामस्वरूप पूरी तरह से पूंछ रिकर्सिव कोड है। यह इनपुट संरचना की प्रतिलिपि बनाता है और फिर ऊपर-नीचे तरीके से उत्परिवर्तन द्वारा, नया तत्व जोड़ता है। (यह में पारित किसी भी डेटा को बदल नहीं करता है और उसके परिणाम के उत्पादन के लिए छोड़कर कोई नमूदार असर पड़ता है) के बाद से इस उत्परिवर्तन अपने आंतरिक ताजा बनाए गए डेटा को किया जाता है, यह अभी भी बाहर की दुनिया में कार्यात्मक है:
(define (add-elt lst elt)
(let ((result (list 1)))
(let loop ((p result) (lst lst))
(cond
((null? lst)
(set-cdr! p (list elt))
(cdr result))
(else
(set-cdr! p (list (car lst)))
(loop (cdr p) (cdr lst)))))))
मुझे पसंद है "हेड-सेंटीनेल" चाल का उपयोग करके, यह केवल एक अतिरिक्त विपक्ष सेल आवंटित करने की लागत पर कोड को बहुत सरल बनाता है।
यह कोड कुछ भाषाओं में (उदाहरण के लिए प्रोलॉग) को एक कंपाइलर द्वारा स्वचालित रूप से पूरा करने के लिए निम्न-स्तरीय उत्परिवर्तन प्राइमेटिव का उपयोग करता है। काल्पनिक योजना TRMC-के अनुकूलन में, हमने निम्न पूंछ पुनरावर्ती सापेक्ष विपक्ष कोड लिखने में सक्षम होगा, और एक संकलक स्वचालित रूप से है यह ऊपर कोड के कुछ बराबर में अनुवाद: अगर के लिए नहीं
(define (append-elt lst elt) ;; %% in Prolog:
(if (null lst) ;; app([], X, Z) :- Z=[X].
(list elt) ;; app([A|B], X, Z) :-
(cons (car lst) ;; Z=[A|Y], % cons _before_
(append-elt (cdr lst) elt)))) ;; app(B, X, Y). % tail call
cons
ऑपरेशन, append-elt
पूंछ-रिकर्सिव हो। यह वह जगह है जहां टीआरएमसी अनुकूलन खेल में आता है।
स्रोत
2012-11-06 17:52:35
@WillNess AFAIK, जब भी आप 'का उपयोग सेट', 'सेट कार', 'सेट सीडीआर'!! अब एक कार्यात्मक समाधान नहीं माना जाता है, आप इस मामले में राज्य - विपक्षी कोशिकाओं को बदल रहे हैं। भले ही यह बाहर पर कार्यात्मक प्रतीत होता है। –
मेरा कोड किसी भी बाहरी कार्यक्रम द्वारा देखे जाने वाले किसी भी राज्य को म्यूटेट नहीं करता है। और यह जगह में इनपुट सूची को म्यूट नहीं करता है। –
मैंने क्यू को दोबारा पढ़ा है, हां मेरा कार्यान्वयन "कार्यात्मक शैली ** कार्यान्वयन **" नहीं है जिसे क्यू पूछता है। जैसा कि आप इंगित करते हैं, अंतर्निहित 'स्नोक' ऑपरेशन के बिना या अतिरिक्त 'रिवर्स' का उपयोग किए बिना ऐसा नहीं किया जा सकता है। –