SICP 연습문제 2.27 친절한 풀이

문제

연습문제 2.18에서 만든 reverse 프로시저를 고쳐서, 리스트를 인자로 받는 deep-reverse 프로시저를 짜보라. deep-reverse 프로시저는 리스트의 원소 차례를 뒤집을 뿐 아니라, 모든 부분 리스트를 따라 내려가서 그 원소들의 차례도 다 뒤집는다. 두 프로시저를 만들어 돌려보면, 아래와 같은 결과가 나와야 한다.

(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))

문제로 부터 얻은 것

pair?를 사용해볼 수 있는 기회였습니다.

문제풀이

연습문제 2.18의 reverse 프로시저는 아래와 같습니다.

(define (reverse x)
(define (reverse-iter x result)
(if (null? x)
result
(reverse-iter (cdr x) (cons (car x) result))))
(reverse-iter x nil))



기존의 프로시저에서 제가 손댄 곳은 if문의 안쪽밖에 없습니다. 그 방법은, null?을 검사한 후에 (pair? (car x))를 한번 더 검사하는 것입니다. 만약 이번에 검사하는 리스트의 원소가 또다른 리스트라면, reverse한 값을 넘겨주면 되는 것입니다.

(define (deep-reverse x)
(define (reverse-iter x result)
(if (null? x)
result
(if (pair? (car x))
(reverse-iter (cdr x) (cons (deep-reverse (car x)) result))
(reverse-iter (cdr x) (cons (car x) result)))))
(reverse-iter x nil))



문제의 테스트 코드에 예상대로 동작하는 모습




읽어주셔서 감사합니다.