問題 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)