さかもとのブログ

つらつらと

SICP3.5.5節

演習問題3.81, 3.82はパスする.
例題が動くよう,random-numberを,簡単だけど,作ってみた.

;;section3.5.5
(load "./stream.scm")
(use srfi-27)

(define (average-int a b)
  (quotient (+ a b) 2))

(define random-numbers
  (cons-stream 1
               (stream-map (lambda (n)
                             (+ 1 (random-integer (average-int 100 n))))
                           random-numbers)))

(stream-ref-print random-numbers 100)

(define cesaro-stream
  (map-successive-pairs (lambda (r1 r2) (= (gcd r1 r2) 1))
                        random-numbers))

(define (map-successive-pairs f s)
  (cons-stream
   (f (stream-car s) (stream-car (stream-cdr s)))
   (map-successive-pairs f (stream-cdr (stream-cdr s)))))

(define (monte-carlo experiment-stream passed failed)
  (define (next passed failed)
    (cons-stream
     (/ passed (+ passed failed))
     (monte-carlo
      (stream-cdr experiment-stream) passed failed)))
  (if (stream-car experiment-stream)
      (next (+ passed 1) failed)
      (next passed (+ failed 1))))

(define pi
  (stream-map (lambda (p) (sqrt (/ 6 p)))
              (monte-carlo cesaro-stream 0 0)))

(stream-ref pi 15000)