SICP 연습문제 2.30 친절한 풀이

문제

연습문제 2.21의 square-list 프로시저 처럼 square-tree 프로시저를 정의해 보자. 다시 말해, square-tree 프로시저는 다음과 같이 돌아가야 한다.

(square-tree
(list 1
(list 2 (list 3 4) 5)
(list 6 7)))
>>> (1 (4 (9 16) 25) (36 49))

square-tree 프로시저를 (차수 높은 프로시저를 쓰지 않고) 곧바로 정의해 보기도 하고, 또 map과 재귀를 써서 정의해 보아라.

문제로 부터 얻은 것

map을 이용한 구현과 그렇지 않은 구현의 미묘한 차이를 알 수 있었습니다.

문제풀이

1. 곧바로 정의한 프로시저

프로시저의 핵심 동작 원리는 x라는 트리를 인자로 받았을때, (square-tree (car x))와 (square-tree (cdr x))의 쌍을 반환하는 것입니다.

(define (square-tree x)
(cond ((null? x) nil)
((pair? x) (cons (square-tree (car x))
(square-tree (cdr x))))
(else (square x))))

2. map과 재귀를 이용한 프로시저

map을 사용하면 null?을 사용하지 않고 프로시저를 짤 수 있습니다.

(define (square-tree x)
(define (square-if-number x)
(if (pair? x)
(map square-if-number x)
(square x)))

(map square-if-number x))

3. 테스트 케이스 동작 확인

두 테스트 케이스에서 모두 잘 동작하는 모습



읽어주셔서 감사합니다.