sicp-3-1-2-3-1-3

Posted on 2015-02-26 01:59:04 +0900 in SICP Lisp

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.

----------------------------------- 本文内容遵从CC版权协议转载请注明出自kamelzcs -----------------------------------
«  | sicp-3-1-1 »

Hide Comments

comments powered by Disqus