2014年2月16日日曜日

開発環境

計算機プログラムの構造と解釈(Gerald Jay Sussman(原著)、Julie Sussman(原著)、Harold Abelson(原著)、和田 英一(翻訳)、ピアソンエデュケーション、原書: Structure and Interpretation of Computer Programs (MIT Electrical Engineering and Computer Science)(SICP))の1(手続きによる抽象の構築)、1.3(高階手続きによる抽象)、1.3.1(引数としての手続き)、問題 1.32-a.を解いてみる。

その他参考書籍

問題 1.32-a.

コード(BBEdit, Emacs)

sample.scm

#!/usr/bin/env gosh
;; -*- coding: utf-8 -*-

(define (accumulate combiner null-value term a next b)
  (define (iter x result)
    (if (> x b)
        result
        (iter (next x)
              (combiner (term x) result))))
  (iter a null-value))

(define (sum term a next b)
  (accumulate + 0 term a next b))

(define (product term a next b)
  (accumulate * 1 term a next b))

     
;; 合成手続き
(define (square x) (* x x))

(define (inc n) (+ n 1))

(define (identity x) x)

(define (sum-integers a b)
  (sum identity a inc b))

(define (pi-sum a b)
  (define (pi-term x)
    (/ 1.0 (* x (+ x 2))))
  (define (pi-next x)
    (+ x 4))
  (sum pi-term a pi-next b))

(define (factorial n)
  (product identity 1 inc n))

(define (pi-product a b)
  (define (pi-term x)
    (/ (* (- x 1.0)
          (+ x 1.0))
       (square x)))
  (define (pi-next x) (+ x 2))
  (product pi-term a pi-next b))

;; テスト
(print "sum手続き")
(print "1 + 2 + …  + 10 = " (sum-integers 1 10))
(print "πの近似値")
(for-each (lambda (x)
            (print (* 8 (pi-sum 1 x))))
          '(100 1000 10000 100000 1000000))

(print "product手続き")
(print "10! = " (factorial 10))
(print "πの近似値")
(for-each (lambda (x)
            (print (* 4 (pi-product 3 x))))
          '(100 1000 10000 100000 1000000))

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

$ ./sample.scm 
sum手続き
1 + 2 + …  + 10 = 55
πの近似値
3.121594652591009
3.139592655589782
3.141392653591789
3.141572653589808
3.1415906535898936
product手続き
10! = 3628800
πの近似値
3.1573396892175642
3.1431638424192028
3.141749737149286
3.1416083615923225
3.1415942243865067
$

0 コメント:

コメントを投稿