2013年5月22日水曜日

開発環境

計算機プログラムの構造と解釈(Gerald Jay Sussman(原著)、Julie Sussman(原著)、Harold Abelson(原著)、和田 英一(翻訳)、ピアソンエデュケーション)の2(データによる抽象の構築)、2.2(階層データ構造と閉包)、2.2.1(並びの表現)の問題 2.21、問題 2.22、問題 2.23を解いてみる。

その他参考書籍

問題 2.21

コード

sample.scm

(define (square-list-1 items)
  (if (null? items)
      items
      (cons (square (car items))
            (square-list-1 (cdr items)))))

(define (square-list-2 items)
  (map square items))

入出力結果(Terminal, REPL(Read, Eval, Print, Loop))

1 ]=> (square-list-1 (list 1 2 3 4))

;Value 2: (1 4 9 16)

1 ]=> (square-list-2 (list 1 2 3 4))

;Value 3: (1 4 9 16)

問題 2.22

問題の定義が考えていたのと逆の順に答えのリストを作るのは、反復的プロセスの再帰のところで、数の二乗を順に先頭に追加していっているから。

引数を交換して虫をとろうとしても動かないのは、再帰的手続きで、リストと数値を二乗したものの対を作成していくから。

せっかくなので、反復的プロセスで動くものを作成。

コード

sample.scm

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

入出力結果(Terminal, REPL(Read, Eval, Print, Loop))

1 ]=> (square-list (list 1 2 3 4))

;Value 4: (1 4 9 16)

問題 2.23

コード

sample.scm

(define (for-each proc items)
  (cond ((null? items) true)
        (else (proc (car items))
              (for-each proc (cdr items)))))

入出力結果(Terminal, REPL(Read, Eval, Print, Loop))

1 ]=> 
(for-each (lambda (x) (newline) (display x))
          (list 57 521 88))

57
521
88
;Value: #t

0 コメント:

コメントを投稿