SICP 연습문제 2.24 친절한 풀이

문제

식 (list 1 (list 2 (list 3 4)))를 계산한다고 할 때, 실행기가 계산한 값을 어떻게 찍어내는지, 그 값은 상자와 화살표 구조로 나타내면 어떠한지, 또 (그림 2.6처럼) 나무꼴로 그려 보면 어떠한지 나타내어라.

문제로 부터 얻은 것

list와 cons의 차이를 확실히 알 수 있었습니다.

문제풀이

a. 실행기의 계산값

문제의 요구대로 바로 한번 실행시켜 보겠습니다.
(1 (2 (3 4)))

식 (list 1 (list 2 (list 3 4)))는 (1 (2 (3 4)))로 출력됩니다.

b. 상자와 화살표 구조

(1 2 3 4)와 (1 (2 (3 4)))를 상자와 화살표 구조로 나타내면 다음과 같습니다. 흔히 범하는 오류는 (1 (2 (3 4)))를 아래 그림의 첫번째 다이어그램으로 생각하는 것입니다. 괄호 “(”, ")"는 리스트를 나타내는 괄호이지 cons를 나타내는 괄호가 아닙니다. 이 괄호가 cons를 나타내는 괄호였다면, (1 (2 (3 4)))는 아래 그림의 첫번째 다이어그램과 같은 모습이었을 것입니다. 잘 이해가 안되신다면, 책의 2.2.1절의 그림 2.4를 보시면 이해가 쉬울 것입니다.
비슷하지만 다른 모양의 두 리스트

c. 나무꼴 그림

위의 상자와 화살표 구조를 이해했다면 나무꼴 그림을 그리는 것은 쉬울 것입니다.
똥손이 그린 나무꼴

d. 앞절의 이해

여기까지 이해하셨다면, 앞의 2.2.2절의 length 부분을 잘 이해할 수 있을 것입니다. 이해의 핵심은 (list a b)\neq(cons a b)라는 것입니다. 이 식을 옳게 고친다면, (list a b)==(cons a (cons b nil))입니다.

(define x (cons (list 1 2) (list 3 4)))

(length x)
>>> 3

(length (list x x))
>>> 2

x의 원소는 [(list 1 2), 3, 4]로 총 3개의 원소를 가지므로 길이는 3입니다.


(list x x)의 원소는 [x, x]로 총 2개의 원소를 가지므로 길이는 2입니다.



읽어주셔서 감사합니다.