計算機プログラムの構造と解釈 第二版 P34 問題1.31

実は理解が足りないのかもしれないが、わりと簡単に問題が解けた。
解くための方針は以下みたいな感じ。


まず、productの問題。
sumはある式の解を、がんがん足していくのだが、
productは式の解を、がんがん掛けていく。
だから基本的に以前作ったsumの「+」を「-」にすればいい。
反復的な場合もほとんど同じなんだけど、初期のresultの部分に0を入れちゃうと
解は必ず0になっちゃう。かけ算していくから、1をいれておこう。


んで、factorialの問題。
これは、productがほとんど解決している問題なのであれですが、
nextは入力パラメータを1ずつインクリメントさせて返す。
termは入力パラメータをそのまま返してやる。


んで、π/4を求めるみたいな問題は、
問題1.29のみたく、項を2ずつインクリメントさせていく感じにすると
割と簡単に法則性をつかめる。
だけど問題1.29みたく終了条件は厳密にしなかった。


こんな感じの方針で、だした解答がこちらだ!!

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

(use ggc.debug.trace)
(use math.mt-random)

;;再帰的プロセス
(define (product term a next b)
  (if (> a b)
    1
    (* (term a)
       (product term (next a) next b))))


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


;;反復的プロセス
(define (product_r term a next b)
  (define (iter a result)
    (if (> a b)
      result
      (iter (next a) (* result (term a)))))
  (iter a 1))


(define (f x)
  (* (/ (+ x 2.0) (+ x 3.0))
     (/ (+ x 4.0) (+ x 3.0))))

(define (next x)
  (+ x 2))


;; main
(define (main args)
  (display "factorial : ")
  (display (factorial 5))(newline)

  (display "再帰的プロセスで、4倍した値 ")
  (display (* 4 (product f 0 next 1000)))(newline)
  (display "反復的プロセスで、4倍した値 ")
  (display (* 4 (product_r f 0 next 1000)))(newline)
0)


実行!!

factorial : 120
再帰的プロセスで、4倍した値 3.143157581145993
反復的プロセスで、4倍した値 3.1431575811459935

たぶんできているんじゃないかなぁ。