SICP 문제 풀이

1897 단어
SICP 연습 문제 2.4 는 매우 재 미 있 는 문제 로 어느 정도 에 데이터 구조 에 대한 인식 을 바 꿀 것 이다.
제목 에 따 르 면 여기 서 말 하 는 것 은 '순서 가 맞 는 과정 적 표현' 이다.
서 는 여러분 에 게 익숙 해 야 합 니 다. 앞의 몇 문제 가 모두 서 대 와 관계 가 있 습 니 다. 그러면 서 대 의 '과정 적 표시' 는 무슨 뜻 입 니까?
쉽게 말 하면 하나의 과정 (또는 함수 라 고 함) 으로 순서 쌍 을 실현 하 는 것 이다.
그 전에 많은 프로그래머 들 에 게 데 이 터 는 데이터 이 고 과정 은 과정 이 며 둘 은 단독으로 존재 하 며 과정 은 일반적으로 데 이 터 를 방문 하 는 데 사용 되 었 다.여기 서 말 한 것 처럼 하나의 과정 을 사용 하여 데이터 구 조 를 실현 하 는 것 은 정말 이상 한 일이 다.
먼저 문제 가 제시 한 사례 를 살 펴 보 자. 문 제 는 우리 가 다음 과 같은 과정 정의 가 있다 면 임의의 x 와 y, (car (cons x y) 에 대해 x 가 생 길 것 이 라 고 말 했다.
(define (cons x y)
  (lambda (m) (m x y)))

(define (car z)
  (z (lambda (p q) p)))

위의 코드 를 읽 기 에는 여전히 좀 어렵다. 왜냐하면 두 개의 lambda 과정 과 관련 되 기 때문이다.
제목 에서 말 한 것 처럼 이곳 의 과정 을 잘 이해 하기 위해 교체 방식 을 사용 하 는 것 을 권장 합 니 다. 우 리 는 교체 과정 을 살 펴 보 겠 습 니 다.
(car(cons x y))
=> (car (lambda (m) (m x y)))
=> ((lambda (m) (m x y)) (lambda (p q) p))
=> ((lambda (p q) p) x y)
=>((lambda (x y) x))
=> x
나 는 처음 이 교체 과정 을 마치 고 신기 하 게 도 카드 가 유 겸 에 게 서 사라 지 는 것 을 지 켜 보 는 것 같 았 다.
여기 cons 는 lambda 함 수 를 되 돌려 줍 니 다. 이 lambda 함 수 는 매개 변 수 를 받 아들 여 x y 에 작용 합 니 다.
한편, car 는 하나의 인 자 를 받 아들 여 이 인 자 를 다른 lambda 함수 에 작용 합 니 다. 이 lambda 함 수 는 두 개의 인 자 를 받 아들 여 첫 번 째 인 자 를 영원히 되 돌려 줍 니 다.
cons 와 car 를 연결 하여 사용 하 는 것 은 'x y 에 작용 하여 첫 번 째 매개 변수 x 를 영원히 되 돌려 줍 니 다' 입 니 다.
이것 은 이해 한 후에 문 제 를 완성 하 는 것 이 비교적 간단 합 니 다. 문 제 는 우리 에 게 이 사고 에 따라 cdr 과정 을 정의 하 라 고 요구 합 니 다. 제 가 정의 한 cdr 코드 는 다음 과 같 습 니 다.
(define (cdr z)
  (z (lambda (p q) q)))

cdr 는 하나의 인 자 를 받 아들 이 고 이 인 자 를 하나의 lambda 과정 에 작용 하 며 이 lambda 과정 은 두 개의 인 자 를 받 아들 여 두 번 째 인 자 를 영원히 되 돌려 줍 니 다.
이렇게 문 제 는 완성 되 었 지만, 이 문제 가 우리 에 게 가 져 다 준 깨 우 침 에 대해 서 는 우리 가 자세히 생각해 볼 만하 다.
문 제 를 완성 하 는 것 은 쉬 워 도 문제 의 의 도 를 이해 하 는 것 은 쉽 지 않다.

좋은 웹페이지 즐겨찾기