さかもとのブログ

つらつらと

SICP演習問題3.77~3.79

3.77にちょっとはまった.

;;exercise3.77
(define (solve f y0 dt)
  (define dy (stream-map f y))
  (define y (integral (delay dy) y0 dt))
  y)

(define (integral delayed-integrand initilal-value dt)
  (cons-stream initilal-value
               (let ((integrand (force delayed-integrand)))
                 (if (stream-null? integrand)
                     the-empty-stream
                     (integral (delay (stream-cdr integrand))
                               (+ (* dt (stream-car integrand))
                                  initilal-value)
                               dt)))))
(integral (delay (stream-cdr integrand))

ここのdelayがなければ,再起呼び出しのletのforceで無限ループに突入する.
integralに渡すintegrandはdelayされていなければいけない.

;;exercise3.78
(define (solve-2nd a b y0 dy0 dt)
  (define ddy (add-streams
               (scale-stream dy a)
               (scale-stream y b)))
  (define dy (integral (delay ddy) dy0 dt))
  (define y (integral (delay dy) y0 dt))
  y)

;;exercise3.78
(define (solve-2nd f y0 dy0 dt)
  (define ddy (stream-map f dy y))
  (define dy (integral (delay ddy) dy0 dt))
  (define y (integral (delay y) y0 dt))
  y)

(stream-ref-print (solve-2nd (lambda (dy y) (+ (* -2 dy) (* -16 y))) 1 0 0.01) 100)