Решение упражнения 2.27 из SICP

28 January, 2008 (22:05) | Решения упражнений

Определение процедуры reverse можно посмотреть в решении упражнения 2.18.

В определении deep-reverse все остается прежним, кроме того, что при переносе очередного элемента из исходного списка в результирующий мы “реверсируем” этот элемент (процедура reverse-it). Реверсирование элемента для списка означает deep-reverse для него, а реверсирование атомарного значения (не списка) возвращает само это значение.

(define (deep-reverse items)
  (define (deep-reverse-iter source result)
    (define (reverse-it element)
      (if (list? element)
          (deep-reverse element)
          element))
    (if (null? source)
        result
        (deep-reverse-iter (cdr source)
                           (cons (reverse-it (car source)) result))))
  (deep-reverse-iter items (list)))

Подход “глубоких” (deep) операций в противовес поверхностным широко применяется в разработке программ. Как правило речь идет именно об операциях над данными древовидной структуры. Поверхностный подход затрагивает лишь данные верхнего уровня иерархии, в то время как глубокий касается всех уровней.

Comments

Comment from tymmym
Date: May 27, 2008, 10:53 am

(define (deep-reverse items)
  (define (rev items res)
    (cond ((null? items) res)
          ((not (pair? items)) items)
          (else (rev (cdr items) (cons (rev (car items) (list)) res)))))
  (rev items (list)))

Comment from JessicaFletcher
Date: March 17, 2009, 12:37 pm

(define (d-reverse item)
(cond ((= (cdr item) null) item)
((notpair? (car item)) item)
(else (cons (d-reverse (cdr item)) (d-reverce (car item))))))

Write a comment