SICP 연습문제 2.2 친절한 풀이

문제

평면에 선분을 긋는 문제를 생각해 보자. 모든 선분은 시작 점과 끝 점의 쌍으로 나타낼 수 있다. 두 점을 짜맞춰 선분을 만들어 내는 make-segment와 선분에서 두 끝 점을 골라내는 start-segment, end-segment를 정의하라. 또한, 점도 x좌표를 나타내는 수와 y 좌표를 나타내는 수를 한 쌍으로 해서 나타낼 수 있다. 그에 따라 make-point와 x-point, y-point를 만들어서 이런 표현 방법을 정의하라. 끝으로 지금까지 만든 짜맞추개와 고르개를 써서 선분을 인자로 받아 가운데 점(선분의 두 끝점을 편균하여 얻어낸 좌표점)을 내놓는 프로시저 midpoint-segment를 정의하라. 그 다음에 아래와 같이 점의 좌표를 찍어내는 프로시저를 써서 결과가 제대로 나오는지 확인해 보라.

(define (print-point p)
(newline)
(display "(")
(display (x-point p))
(display ",")
(display (y-point p))
(display ")"))

문제로 부터 얻은 것

cons, car, cdr의 사용을 연습할 수 있었습니다.

문제풀이

point와 segment의 짜맞추개와 고르개 프로시저들은 cons, car, cdr을 이용해서 쉽게 표현할 수 있었습니다.

(define (make-point x y)
(cons x y))

(define (x-point p)
(car p))

(define (y-point p)
(cdr p))

(define (make-segment p1 p2)
(cons p1 p2))

(define (start-segment seg)
(car seg))

(define (end-segment seg)
(cdr seg))



(midpoint-segment seg)는 점과 점 사이의 중점을 구하는 프로시저 (midpoint p1 p2)를 이용해서 표현했습니다.

(define (midpoint p1 p2)
(let ((x (/ (+ (x-point p1) (x-point p2)) 2))
(y (/ (+ (y-point p1) (y-point p2)) 2)))
(make-point x y)))

(define (midpoint-segment seg)
(midpoint (start-segment seg) (end-segment seg)))



문제에서 제공한 (print-point p)를 이용해서 아래의 테스트를 진행해 보았습니다.

(define point1 (make-point 2 0))
(define point2 (make-point 4 5))
(define segment (make-segment point1 point2))
(define mid (midpoint-segment segment))
(print-point mid)

(2,0)과 (4,5)의 중점인 (3,2.5)

읽어주셔서 감사합니다.