問題3-5〜6
「3.1.2 代入を取り入れた利点」ということで、代入や局所変数という概念を使うことによる利点が述べられています。例えば、ランダムな値を引き出す手続きとして、(random x)のように何らかの引数を指定するのか、(rand)のようにrand手続きの中の局所変数を繰り返し適用するのか、この違いについての事例が述べられています。あるデータ構造の中に局所変数を組み込み、外部から引き離すことで複雑さを緩和できるという意味なのでしょうが、この節の問題をきっちり解くことができなかったので、理解も曖昧なままです。
とりあえず、問題3-5はやってみたので、そのコードを載せておきます。
(define (estimate-integral p x1 x2 y1 y2 trials) (* (* (- x2 x1) (- y2 y1)) (monte-carlo trials (lambda () (p (random-in-range x1 x2) (random-in-range y1 y2)))))) (define (random-in-range low high) (let ((range (- high low))) (+ low (random range)))) (define (monte-carlo trials experiment) (define (iter trials-remaining trials-passed) (cond ((= trials-remaining 0) (/ trials-passed trials)) ((experiment) (iter (- trials-remaining 1) (+ trials-passed 1))) (else (iter (- trials-remaining 1) trials-passed)))) (iter trials 0)) (define (p1 x y) (>= 1 (+ (square (- x 1)) (square (- y 1))))) (define (p2 x y) (>= 100 (+ (square (- x 10)) (square (- y 10))))) (estimate-integral p1 0 2 0 2 10000) (estimate-integral p2 0 20 0 20 10000)
何度か実行してみたところ、p1の方は2の後半から3の前半、p2の方は314前後の値が返ってきました。
いずれにせよ、この節で例示されていた代入を使える時と使えない時の違いという視点をしっかりと持ちながら、先へ進んでいきたいと思います。