SICP 연습문제 2.21 친절한 풀이

문제

square-list 프로시저는 다음과 같이 수 리스트를 인자로 받아서 모든 원소를 제곱한 다음 그 결과로 묶어서 리스트를 내놓는다.

(sqaure-list (list 1 2 3 4))
>>> (1 4 9 16)

square-list 프로시저를 정의하는 방법은 다음 두 가지다. 빈 곳을 채워 프로시저를 완성하라.

(define (square-list items)
(if (null? items)
nil
(cons <??> <??>)))

(define (square-list items)
(map <??> <??>))

문제로 부터 얻은 것

map 프로시저의 구현 방법과 활용법을 알 수 있었습니다.
map 프로시저가 다른 함수를 인자로 받는 차수 높은 프로시저라는 것을 이해했습니다.
map 프로시저가 사용자로부터 어떻게 리스트가 배열되는지는 숨겨주는 요약의 경계 역할도 하는 것을 이해했습니다.

문제풀이

문제의 바로 앞 절에서 나온 map 프로시저는 다음과 같습니다.

(define (map proc items)
(if (null? items)
nil
(cons (proc (car items))
(map proc (cdr items)))))



프로시저의 동작 원리를 이해했다면, 물음표를 채우는 것은 어렵지 않습니다.

(define (square-list items)
(if (null? items)
nil
(cons (square (car items))
(square-list (cdr items)))))

(define (square-list items)
(map square items))



문제에서 나온 아래의 테스트 코드를 두 프로시저로 실행해 보겠습니다.

(square-list (list 1 2 3 4))

두 프로시저 모두 (1 4 9 16)을 반환하는 모습



읽어주셔서 감사합니다.