理系学生日記

おまえはいつまで学生気分なのか

忍者TOOLS

問題1-31(a)

まずはかけ算ばっかするproductを定義してみる。これはほとんど問題1-30 - 理系学生日記からパクった。

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

じっさいに1から6までかけまくってみると720になって、たぶん合ってる。

gosh> (product identity 1 inc 6)
720

これ使うと、階乗とかちょうキレい!

(define (identity x) x)
(define (inc x) (+ x 1))

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

キレいすぐる!!

gosh> (factorial 6)
720

あと、product使って\frac{\pi}{4} = \frac{2\cdot 4\cdot 4\cdot 6\cdot 6\cdot 8\cdots}{3\cdot 3\cdot 5\cdot 5\cdot 7\cdot 7\cdots}も使って、\piを計算しろっていう課題がある。

(define (plus-2 x) (+ x 2))
(define (square x) (* x x))

(define (approx-pi n)
  (define (term i)
    (/ (* (- i 1) (+ i 1))
       (square i)))
  (* 4
     (product term 3.0 plus-2 n)))

とかやって計算してみるお。

gosh> (approx-pi 10000)
3.1417497371492855

意外と精度がよいです。