sicp-3-1-2-3-1-3
Posted on 2015-02-26 01:59:04 +0900 in SICP
3.5
#lang racket
(define (square x) (* x x))
(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 (rect-area x1 x2 y1 y2)
(abs (* (- x2 x1) (- y2 y1))))
(define (estimate-integral P x1 x2 y1 y2 trials)
(define (test)
(P (random-in-range x1 x2) (random-in-range y1 y2)))
(* (monte-carlo trials test)
(rect-area x1 x2 y1 y2)))
(define (estimate-pi trials)
(define (P x y)
(< (+ (square x) (square y)) 1.0))
(estimate-integral P -1.0 1.0 -1.0 1.0 trials))
(estimate-pi 10000000)
The random
function in neil/sicp
dialect would only return integer
,
to return a real
number back, I have to rely on the racket
dialect.
3.7
(define (make-joint acc acc-pass new-pass)
(define (dispatch password m)
(if (eq? password new-pass)
(acc acc-pass m)
(error "Bad password" password)))
dispatch)
3.8
(define f
(let ((state 0))
(lambda (x)
(let ((old-state state))
(set! state x)
old-state))))
The key lies in to make a closure and make use of its side effect.
Hide Comments
comments powered by Disqus