SICP 연습문제 2.25 친절한 풀이

문제

다음 리스트에서 7을 끄집어 내려면 car과 cdr 연산을 어떻게 엮어 써야 하는지 밝혀라.

(1 3 (5 7) 9)(1 \ 3 \ (5 \ 7) \ 9)

((7))((7))

(1 (2 (3 (4 (5 (6 7))))))(1 \ (2 \ (3 \ (4 \ (5 \ (6 \ 7))))))

문제로 부터 얻은 것

list와 cons의 관계에 대한 이해도가 상승했습니다.

문제풀이

문제에서 주어진 리스트를 스킴으로 표현하면 아래와 같습니다.

(define li-1 (list 1 3 (list 5 7) 9))

(define li-2 (list (list 7)))

(define li-3 (list 1 (list 2 (list 3 (list 4 (list 5 (list 6 7)))))))



한번에 쉽게 풀 수 있을 줄 알았는데, 생각보다 많이 틀렸습니다. 우선 정답은 아래와 같습니다.

(car (cdr (car (cdr (cdr li-1)))))

(car (car li-2))

(car (cdr (car (cdr (car (cdr (car (cdr (car (cdr (car (cdr li-3))))))))))))



주로 헷갈렷던 포인트는 이렇습니다. 아래의 정리들만 잘 기억해도 헷갈리지 않을 것 같습니다.

(cdr (a b))b(cdr \ (a \ b)) \neq b

(cdr (a b))=(b)(cdr \ (a \ b))=(b)

(car (cdr (a b)))=b(car \ (cdr \ (a \ b)))=b



읽어주셔서 감사합니다.