2008. 4. 16.

연습문제 2.22

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

이 결과는 다음과 같다.

(16 9 4 1)


문제는 cons를 하는 부분에 있다. 가장 마지막에 결과가 cons되므로 역순으로 출력된다. map의 정의를 다시 생각해볼것

(define (square-list-iter2 items)
  (define (iter things answer)
    (if (null? things)
        answer
        (iter (cdr things)
              (cons answer
                    (square (car things))))))
  (iter items nil))


의 결과는 다음과 같다.

((((() . 1) . 4) . 9) . 16)


역시 cons부분에서 문제를 찾아야한다.
(cdr things)와 cons부분의 변화를 살펴보자면.... (리스트는 (1 2 3 4)였다고 가정...

1) (2 3 4) (cons nil 1) -> ((). 1)
2) (3 4) (cons ((). 1) 4) -> ((() . 1) . 4)

...
식이 됨을 알 수 있다.

정확한 답을 원한다면 cons는 append로 바꾸고 이후에 나오는 square식을 list화 해야한다.

(define (square-list-iter3 items)
  (define (iter things answer)
    (if (null? things)
        answer
        (iter (cdr things)
              (append answer
                    (list (square (car things)))))))
  (iter items nil))


댓글 없음:

댓글 쓰기