이 문제는 리스트의 끝을 처음으로 돌리는 make-cycle 프로시저를 만들어

결과를 last-pair 프로시저의 인자로 넣으면 어떤 일이 생기는지 예측하는 문제입니다.

 

c5

예상대로 무한루프를 돌고 있습니다.

 

 

이유는 다음과 같습니다.

(make-cycle (list 'a 'b 'c))로 (list 'a 'b 'c)의 끝을 그 처음으로 돌립니다.

그렇기에 z는 이처럼 나옵니다.

05

파란색 실선이 make-cycle이 하는 일입니다.

 

last-pair 프로시저는 원소의 cdr이 null이 나올 때까지 탐색합니다.

하지만 어느 원소도 cdr에 null을 가지고 있지 않습니다.

(원래 c가 가지고 있었으나 위에 그림처럼 바뀌었지요.)

따라서 계속해서 탐색을 하여 무한루프에 빠지는 것입니다.

 

 

참조

해럴드 애빌슨, 김재우 역, <컴퓨터 프로그램의 구조와 해석>, 인사이트, 2007, pp. 332

 

 

; exercise 3.12
(define (last-pair x)
  (if (null? (cdr x))
      x
      (last-pair (cdr x))))

(define (make-cycle x)
  (set-cdr! (last-pair x) x)
  x)

(define z (make-cycle (list 'a 'b 'c)))

; execute
z
(last-pair z)

크리에이티브 커먼즈 라이선스
Creative Commons License

글에 잘못된 점, 다른 점, 부족한 점이 있다면 지적해주세요.
댓글, 트랙백, 메일 모두 고맙습니다.

트랙백 주소 :: http://nosyu.pe.kr/trackback/1439

댓글을 달아 주세요

[로그인][오픈아이디란?]