問題1.31
a.
sum手続きは高階手続きとして書ける,同様な数多い抽象の最も単純なものに過ぎない.与えられた範囲の点での関数値の積を返すproductという似た手続きを書け.productを使って,factorialを定義せよ.また式
π/4 = (2*4*4*6*6*8...)/(3*3*5*5*7*7...)
によってπの近似値を計算するのにproductを使え.
b.
上のproductが再帰的プロセスを生成するなら,反復的プロセスを生成するものを書け.反復的プロセスを生成するなら,再帰的プロセスを生成するものを書け.
--
; --
; 標準的関数をロード
; --
(load "./util.scm")
; --
; 再帰的なproductの実装
; --
(define (product-rec term a next b)
(if (> a b)
1
(* (term a)
(product-rec term (next a) next b)))
)
(print "再帰的な計算(2): " (product-rec identity 1 inc 2)) ; (factorial 2)
(print "再帰的な計算(3): " (product-rec identity 1 inc 3)) ; (factorial 3)
(print "再帰的な計算(4): " (product-rec identity 1 inc 4)) ; (factorial 4)
; --
; πを近似する(バグってるぽい...)
; --
(define (plus2 n)
(+ n 2)
)
(print (* (/ (* 2 (square (product-rec identity 4 plus2 10000))) (square (product-rec identity 3 plus2 10001))) 4))
; --
; 反復的なproductの実装
; --
(define (product-rep term a next b)
(define (iter a result)
(if (> a b)
result
(iter (next a) (* result (term a)) )))
(iter a 1)
)
(print "反復的な計算(2): " (product-rep identity 1 inc 2)) ; (factorial 2)
(print "反復的な計算(3): " (product-rep identity 1 inc 3)) ; (factorial 3)
(print "反復的な計算(4): " (product-rep identity 1 inc 4)) ; (factorial 4) 再帰的なproductと反復的なproductは実装できたが、πの近似値がでない。とても大きい値が返る。後でSICP読書会にてスーパーハッカー達に質問して、追記する。

コメント一覧
この記事にコメントしてください
(*) は必須入力項目です。