이글루스 | 로그인  


SICP Exercise 연습문제 3.16 - 수정

이제 SICP를 시작합니다.

(방학을 언제 시작했는데 이제서야..ㅜ)

 

전에 풀었던 SICP Exercise 3.16의 답이 틀린 듯싶어 다시 풀었습니다.

바로 위처럼 코드를 바꾼 것입니다.

 

사실 연습문제 3.17을 풀려고 하는데 생각이 잘 떠오르지 않아서 고민하다가

연습문제 3.16의 문제를 살펴보니 '세 쌍으로만 구성된 리스트'라고 적혀있습니다.

본래의 글에서는 이를 무시하고 만든 것입니다.

따라서 이번에 여기에 맞게 만들었습니다.

 

무한루프를 돌기에 메모리 부족이 발생하였습니다.^^

 

그리고 이것이 set-car!과 set-cdr!을 써서 만든 것입니다.

이렇게 코드를 짜는 것이 좀 더 읽기 편할 듯싶어서입니다.

 

역시 같은 결과가 나오고 있습니다.

 

그리고 프로그램을 PLT-Scheme v372로 다시 옮겼습니다.

자꾸 null이 없다느니 set-car!이 없다느니 하는 얘기를 해서 짜증이 나 옮긴것입니다.

왜 버전이 올라가면서 되던 것이 안 되게 만드는지 모르겠습니다.OTL...

 

 

위에서 만든 것들을 그림으로 옮겨보았습니다.

설명은 두 번째 것(어차피 같은 것을 수행하지만....)을 기준으로 하겠습니다.

 

초기상태

초기상태를 보시면 pair가 총 세개 있습니다.

이제 이 값들을 수정하여 count-pairs의 값을 바꿔보겠습니다.

 

a의 car이 b를 가리키고, b의 cdr이 c를 가리킵니다.

그리고 c의 cdr이 null로 설정하였습니다.

이는 일반적으로 (list 1 2 3)으로 한 것과 동일한 효과입니다.^^

따라서 이를 count-pairs를 돌리면 3이 나옵니다.

 

보기 좋게 하기 위해서 a의 car이 b를 가리키고 b의 cdr이 c를 가리키고 하였습니다.

이렇게 되면 c가 두 번 계산이 되므로 값은 4가 나옵니다.

 

이번에는 a의 car과 cdr이 b를 가리키고, b의 car과 cdr이 c를 가리키게 하였습니다.

따라서 a의 car로 b가 한 번 c가 두 번 계산되고,

마찬가지로 a의 cdr로 같은 계산을 하기에 총 6번이 나옵니다.

거기에 a 자신을 더하여 최종값은 7이 나옵니다.

 

마지막으로 무한루프를 돌아가는 것입니다.

간단하게 a는 b를 가리키고 b는 c를 가리키고 c는 a를 가리키게 만들면 됩니다.

그래서 c의 cdr이 a를 가리키도록 하여 이를 만들었습니다.

 

 

오랜만에 SICP 문제를 풀려니 잘 되지 않네요.^^OTL.....

어렵습니다.ㅜㅜ

 

 

참조

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

http://nosyu.egloos.com/4242686

 

 

; exercise 3.16
(define (count-pairs x)
  (if (not (pair? x))
      0
      (+ (count-pairs (car x))
         (count-pairs (cdr x))
         1)))

; 처음 구상한 코드
;; answer
;(define b (list 2))
;b
;(newline)
;; 3
;(list 1 2 3)
;(count-pairs (list 1 2 3))
;(newline)
;; 4
;(define c (cons 1 b)) (define d (cons c b))
;d
;(count-pairs d)
;(newline)
;; 7
;(define e (cons b b)) (define f (cons e e))
;f
;(count-pairs f)
;(newline)
;; infinite
;(set-cdr! b f)
;(count-pairs f)

; 보기 쉽게 새롭게 구성
; answer
(define a (cons 1 2))
(define b (cons 3 4))
(define c (cons 5 6))
a b c
(newline)
; 3
(set-cdr! a b) (set-cdr! b c) (set-cdr! c null)
a (count-pairs a)
(newline)
; 4
(set-car! a b) (set-cdr! a c) (set-cdr! b c)
a (count-pairs a)
(newline)
; 7
(set-car! a b) (set-cdr! a b) (set-car! b c) (set-cdr! b c)
a (count-pairs a)
(newline)
; infinite
(set-cdr! c a)
(count-pairs a)
(newline)

by NoSyu | 2008/07/03 21:23 | in OCW | 트랙백 | 핑백(2) | 덧글(0)

트랙백 주소 : http://NoSyu.egloos.com/tb/4464626
☞ 내 이글루에 이 글과 관련된 글 쓰기 (트랙백 보내기) [도움말]
Linked at NoSyu의 주저리 주저리 :.. at 2008/07/03 21:25

... 이 글에 적혀진 답은 제대로 된 답이 아니라 생각하여 새로 풀었습니다.SICP Exercise 연습문제 3.16 - 수정 이 문제는 리스트의 쌍 개수를 찾는 프로시저입니다. 이 프로시저가 틀린 이유와 무한루프를 도는 리스트를 그려보는 문제입니다. &nbs ... more

Linked at NoSyu's English .. at 2008/07/04 00:22

... ecall the Scheme. and I write the post that I solve the problem.http://nosyu.egloos.com/4464626 ... more

:         :

:

비공개 덧글

◀ 이전 페이지          다음 페이지 ▶