問題1.31a、問題1.31b – SICP(計算機プログラムの構造と解釈)その14

問題1.31 a

sum 手続きとほぼ同じ形で表せる(+* になる)。
ただし、a > b の際の戻り値が1となる。

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

product を使って factorial を書く。

(define (factorial n)
  (define (next i) (+ i 1))
  (define (term i) i)
  (product term 1 next n))

(factorial 10)

gosh> factorial
gosh> 3628800

πの近似値の計算

(define (pi1 n)
  (define (next i) (+ i 1))
  (define (f k)
    (if (even? k)
        (/ (+ k 2) (+ k 1))
        (/ (+ k 1) (+ k 2))))
  (* 4.0 (product f 1 next n)))

(pi1 10)
(pi1 100)
(pi1 1000)

gosh> pi1
gosh> 3.2751010413348074
gosh> 3.1570301764551676
gosh> 3.1431607055322663

問題1.31 b

反復的プロセスで product を書き直す。

(define (product2 term a next b)
  (define (iter a result)
    (if (> a b)
        result
        (iter (next a) (* (term a) result))))
  (iter a 1))

πの近似値の計算

(define (pi2 n)
  (define (next i) (+ i 1))
  (define (f k)
    (if (even? k)
        (/ (+ k 2) (+ k 1))
        (/ (+ k 1) (+ k 2))))
  (* 4.0 (product2 f 1 next n)))

(pi2 10)
(pi2 100)
(pi2 1000)

gosh> pi2
gosh> 3.2751010413348074
gosh> 3.1570301764551676
gosh> 3.1431607055322663
計算機プログラムの構造と解釈
ジェラルド・ジェイ サスマン ジュリー サスマン ハロルド エイブルソン
ピアソンエデュケーション
売り上げランキング: 6542
«
»