問題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読書会にてスーパーハッカー達に質問して、追記する。

amazon
『計算機プログラムの構造と解釈』