2014年2月15日土曜日

開発環境

計算機プログラムの構造と解釈(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.31-b.を解いてみる。

その他参考書籍

問題 1.31-b.

問題 1.31-a.では反復的プロセスを生成するものを書いたので、今回は再帰的プロセスを生成するものを書くことに。

コード(BBEdit, Emacs)

sample.scm

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

(define (product term a next b)
  (if (> a b)
      1
      (* (term a) (product term (next a) next b))))

(define (factorial n)
  (product id 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))
     
;; 合成手続き
(define (id x) x)

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

(define (square x) (* x x))

;;
(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 
10! = 3628800
πの近似値
3.1573396892175642
3.143163842419204
3.1417497371492957
3.141608361592229
3.141594224381283
$

0 コメント:

コメントを投稿