<< Previous exercise (2.26) | Index | Next exercise (2.28) >>
A solution that uses reverse to do the work:
(define (deep-reverse t)
(if (pair? t)
(reverse (map deep-reverse t))
t))
Another solution without append
(define (deep-reverse items)
(define (iter items result)
(if (null? items)
result
(if (pair? (car items))
(let ((x (iter (car items) ())))
(iter (cdr items) (cons x result)))
(iter (cdr items) (cons (car items) result)))))
(iter items ()))
Solution that is a simple modification of reverse
(define (deep-reverse tree) (define (iter t result) (cond ((null? t) result) ((not (pair? (car t))) (iter (cdr t) (cons (car t) result))) (else (iter (cdr t) (cons (deep-reverse (car t)) result))))) (iter tree '())) #| > (deep-reverse '((1 2) (3 4))) '((4 3) (2 1)) > (deep-reverse '(1 2 (3 4) 5 (6 (7 8) 9) 10)) '(10 (9 (8 7) 6) 5 (4 3) 2 1) > |# >>>
there is another solution. it may be simpler.
(define (deep-reverse li)
(cond ((null? li) '())
((not (pair? li)) li)
(else (append (deep-reverse (cdr li))
(list (deep-reverse (car li)))))))
Took me a while to implement it without append and reverse.
(define (deep-reverse L) (define (rev L R) (cond ((null? L) R) ((not (pair? (car L))) (rev (cdr L) (cons (car L) R))) (else (rev (cdr L) (cons (rev (car L) '()) R))))) (rev L '())) (define x '((1 2) (3 4))) (deep-reverse x) ;; ((4 3) (2 1))
Here's Eli Bendersky's code, translated into Scheme. It's pretty sharp, and better than my own since it's more concise:
This works for me:
(define (reverse x) (if (pair? x) (append (reverse (cdr x)) (list (reverse (car x)))) x))