Skip to content

2.27

; Modify your `reverse` procedure of Exercise 2.18 to produce a `deep-reverse` 
; procedure that takes a list as argument and returns as its value the list
; with its elements reversed and with all sublists deep-reversed as well. 
; For example,
; (define x (list (list 1 2) (list 3 4))) 
; x
; ((1 2) (3 4))
; (reverse x)
; ((3 4) (1 2))
; (deep-reverse x) 
; ((4 3) (2 1))

(define (deep-reverse x)
    (cond ((null? x) x)
          ((not (pair? x)) x)
          (else (append (deep-reverse (cdr x)) (list (deep-reverse (car x)))))))

(define x (list (list 1 2) (list 3 4))) 
(deep-reverse x) ; ((4 3) (2 1))

(define y (list 1 2))
(deep-reverse y) ; (2 1)

(define z (list 1 (list 4 6)))
(deep-reverse z) ; ((6 4) 1)

(define a (list (list 1 2) 3))
(deep-reverse a) ; (3 (2 1))

(define b (list (list (list 6 3) 4) 4 (list 7 8)))
(deep-reverse b) ; ((8 7) 4 (4 (3 6)))