2015年4月30日木曜日

開発環境

計算機プログラムの構造と解釈[第2版](ハロルド エイブルソン (著)、ジュリー サスマン (著)、ジェラルド・ジェイ サスマン (著)、Harold Abelson (原著)、Julie Sussman (原著)、Gerald Jay Sussman (原著)、和田 英一 (翻訳)、翔泳社、原書: Structure and Interpretation of Computer Programs (MIT Electrical Engineering and Computer Science)(SICP))の2(データによる抽象の構築)、2.2(階層データ構造と閉包性)、2.2.3(公認インターフェースとしての並び)、並びの演算、問題2.38.を解いてみる。

その他参考書籍

問題2.38.

コード(BBEdit, Emacs)

(define fold-right
  (lambda (op initial sequence)
    (if (null? sequence)
        initial
        (op (car (sequence))
            (fold-right op initial (cdr sequence))))))

(define fold-left
  (lambda (op initial sequence)
    (define iter
      (lambda (result rest)
        (if (null? rest)
            result
            (iter (op result
                      (car rest))
                  (cdr rest)))))
    (iter initial sequence)))

(fold-right / 1 (list 1 2 3))           ; 3/2

(fold-left / 1 (list 1 2 3))            ; 1/6

(fold-right list '() (list 1 2 3))      ; (1 (2 (3 ())))

(fold-left list '() (list 1 2 3))       ; (((() 1) 2) 3)

;; opが可換ならば、fold-rightとfold-leftはどのような並びに対しても、同じ値を生じる
(fold-left + 0 (list 1 2 3))
(fold-right + 0 (list 1 2 3))

(fold-left * 1 (list 1 2 3))
(fold-right * 1 (list 1 2 3))

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

$ kscheme  < sample38.scm
kscm> kscm> kscm> 3/2
kscm> 1/6
kscm> (1 (2 (3 ())))
kscm> (((() 1) 2) 3)
kscm> 6
kscm> 6
kscm> 6
kscm> 6
kscm> $

0 コメント:

コメントを投稿