理系学生日記

おまえはいつまで学生気分なのか

問題 3-64 (3.5.3 Exploiting the Stream Paradigm)

平方根をストリームの力を使って求めてみね?そういうのカッコよくね?って問題.
今回の課題は,ストリーム中の連続する 2 要素が tolerance 以下のものを探して,その 2 番目の要素を返す関数 stream-limit を作るって問題.そしてそれを使って平方根を求める.

当然,ストリームは真の値に収束するものでないと,無限にストリームを走査していってしまいますが,今回は 1 章でやった Newton 法を使って真値に収束するストリームを構成しています.

(define (sqrt-improve guess x)
  (average guess (/ x guess)))

(define (sqrt-stream x)
  (define guesses
    (cons-stream 1.0
                 (stream-map (lambda (guess)
                               (sqrt-improve guess x))
                             guesses)))
  guesses)

stream-limit は直感的に書き下して,こういう感じになるかなー.

(define (stream-limit stream tolerance)
  (if (< (abs (- (stream-ref stream 0) (stream-ref stream 1))) tolerance)
      (stream-ref stream 1)
      (stream-limit (stream-cdr stream) tolerance)))

というわけで,ここまで出来たら,実際に \sqrt 2 を求めてみます!!

(define (sqrt x tolerance)
  (stream-limit (sqrt-stream x) tolerance))

(sqrt 2 0.00000001)  ; 1.414213562373095

おー! それっぽいのが出ている!! あたりまえだけど!!