(define (my-reverse ls)
(define (my-reverse-2 ls acc)
(if (null? ls)
acc
(my-reverse-2 (cdr ls) (cons (car ls)) acc)))
(my-reverse-2 ls '()))
इस सूची में उल्टा करने के लिए, संचायक के सामने से आने वाली सूची और यह consing बंद पहला तत्व लेने एक संचायक चर का उपयोग करता है। यह संचय लेने वाले फ़ंक्शन को छुपाता है और केवल उस सूची को उजागर करता है जो सूची लेता है, इसलिए कॉलर को खाली सूची में पास नहीं होना पड़ता है। यही कारण है कि मेरे पास मेरा रिवर्स -2 है।
(my-reverse-2 '(a (b c d) e) '()); will call
(my-reverse-2 '((b c d) e) '(a)); which will call
(my-reverse-2 '(e) '((b c d) a)); which will call
(my-reverse-2 '() '(e (b c d) a)); which will return
'(e (b c d) a)
क्योंकि my-reverse-2
में पिछले समारोह कॉल my-reverse-2
के लिए एक कॉल है, और वापसी मान सही (पहली कॉल की वापसी मान के माध्यम से पारित हो जाता है दूसरा कॉल के रिटर्न मान है, और इतने पर) my-reverse-2
पूंछ अनुकूलित है, जिसका अर्थ यह है कि यह ढेर पर कमरे से बाहर नहीं चलेगा। इसलिए जब तक आप चाहें सूची में इसे कॉल करना सुरक्षित है।
आप इसे नेस्टेड सूचियों पर लागू करना चाहते हैं कुछ इस तरह का उपयोग करें:
(define (deep-reverse ls)
(define (deep-reverse-2 ls acc)
(if (null? ls)
acc
(if (list? (car ls))
(deep-reverse-2 (cdr ls) (cons (deep-reverse (car ls)) acc))
(deep-reverse-2 (cdr ls) (cons (car ls) acc)))))
(deep-reverse-2 ls '()))
यह अगर तत्व सूची में जोड़ने से पहले एक सूची है देखने के लिए जाँच करता है, और अगर यह है तो पहले पराजयों । चूंकि यह स्वयं को आंतरिक सूची को वापस करने के लिए कहता है, यह मनमाने ढंग से घोंसले को नियंत्रित कर सकता है।
(deep-reverse '(a (b c d) e))
->'(e (d c b) a)
जो विपरीत वर्णमाला क्रम में है, इस तथ्य के बावजूद कि एक नेस्टेड सूची है। यह रूप तो मूल्यांकन करता है: सूची उलट कर
प्रारंभ:
(define (reverse-deep l)
(map (lambda (x) (if (list? x) (reverse-deep x) x)) (reverse l)))
छद्म कोड में स्पष्टीकरण:
(deep-reverse-2 '(a (b c d) e) '()); Which calls
(deep-reverse-2 '((b c d) e) '(a))
(deep-reverse-2 '(e) (cons (deep-reverse-2 '(b c d) '()) '(a)))
(deep-reverse-2 '(e) (cons (deep-reverse-2 '(c d) '(b)) '(a)))
(deep-reverse-2 '(e) (cons (deep-reverse-2 '(d) '(c b)) '(a)))
(deep-reverse-2 '(e) (cons '(d c b) '(a)))
(deep-reverse-2 '(e) '((d c b) a))
(deep-reverse-2 '() '(e (d c b) a))
'(e (d c b) a)
स्रोत
2010-11-03 22:42:56
बेहतर जवाब: (परिभाषित करते हैं (rev1 lst) (foldl विपक्ष '() lst)) – wowest