平方根をストリームの力を使って求めてみね?そういうのカッコよくね?って問題.
今回の課題は,ストリーム中の連続する 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)))
というわけで,ここまで出来たら,実際に を求めてみます!!
(define (sqrt x tolerance) (stream-limit (sqrt-stream x) tolerance)) (sqrt 2 0.00000001) ; 1.414213562373095
おー! それっぽいのが出ている!! あたりまえだけど!!