問題 2.22

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

;(square-list (list 1 2 3 4 5))
;->(((((() . 1) . 4) . 9) . 16) . 25)

;car部にインサートしていくので、構造がちがう。
;cdr部に次のコンスをインサートしていかなければならない。
;このかたちは、結果が不確かな状況でも計算できないといけないので、
;再帰的な形とは相性がいいが、反復的なかたちとは相性がわるい。

;解決方法としては、

(define (reverse items)
  (define (reverse-iter i p)
    (if (null? i)
        p
        (reverse-iter (cdr i) (cons (car i) p))))
  (reverse-iter items null))

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

;とするか、
;ふつうに再帰的な方法をとる。
;それ意外は思いつかなかった。

;(square-list (list 1 2 3 4 5))
;-> (1 4 9 16 25)