이 문제는 square-list 프로시저를 반복 프로세스로 만들었으나

제대로 작동하지 않는 이유를 설명해야 합니다.

 

 

먼저 해당 코드들을 돌렸을 때 문제점입니다.

c21

 

 

square-list1은 다음 코드로 작성되었습니다.

c20

이 코드를 돌리면 결과가 뒤집혀서 나옵니다.

 

그 이유는 다섯 번째 줄에 있는

(iter (cdr things) (cons (square (car things)) answer))에서

answer가 iter 프로시저를 실행할수록 리스트 전체 값으로 채워가기 때문입니다.

 

하지만 리스트의 각 원소는 다음 리스트의 원소만을 가리키는 것이 아니라

뒤에 있는 원소 전체의 리스트를 가리킵니다.

즉, (list 1 2 3 4)에서 1은 원소로 1을 가지고

다음 원소를 가리키기 위해 (list 2 3 4)를 가지고 있습니다.

즉, 리스트를 가리키는 cdr을 생각해보면 앞에 있는 것이 가장 길기 때문에

뒤에서 앞으로 채워져야합니다.

 

조금 말이 어렵네요.

이유를 알 수 있는 제일 쉬운 방법은 직접 해보는 것이겠지요.^^

직접 해보면 처음 원소의 answer에 null(nil)이 들어감을 알 수 있습니다.

그리고 다음 원소에 처음 원소를 리스트가 들어갑니다.

그러니 뒤짚혀서 나오지요.

 

 

c22

그리고 단순히 뒤집혔다고 answer와 (square (car things))를 바꾸면

그것은 리스트가 아니게 됩니다.

따라서 저처럼 이상한 결과가 나옵니다.

 

 

이렇게 문제점을 알았다면 반복 프로세스로 만들어야 할텐데,

생각외로 잘 나오지 않았습니다.

혹시 만드신 분은 덧글이나 트랙백 부탁드립니다.^^

 

 

참조

Structure and Interpretation of Computer Programs 2/E - Page 138

 

 

(define (square x) (* x x))

; exercise 2.22
(define (square-list1 items)
  (define (iter things answer)
    (if (null? things)
        answer
        (iter (cdr things)
              (cons (square (car things))
                    answer))))
  (iter items null))

(define (square-list2 items)
  (define (iter things answer)
    (if (null? things)
        answer
        (iter (cdr things)
              (cons answer
                    (square (car things))))))
  (iter items null))

; execute
(square-list1 (list 1 2 3 4))
(square-list2 (list 1 2 3 4))

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

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

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

댓글을 달아 주세요

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