計算機プログラムの構造と解釈 第二版 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
たぶんできているんじゃないかなぁ。