stream-limit
分别取出流的第 n
个值和第 n+1
个值,看看它们之间的误差是否在指定的范围之内,如果是的话就返回第 n+1
个值,否则就继续求值下去:
;;; 64-stream-limit.scm
(define (stream-limit stream tolerance)
(let ((ref-n (stream-car stream))
(ref-n+1 (stream-car (stream-cdr stream))))
(if (close-enough? ref-n ref-n+1 tolerance)
ref-n+1
(stream-limit (stream-cdr stream) tolerance))))
(define (close-enough? x y tolerance)
(< (abs (- x y))
tolerance))
sqrt
载入 stream-limit
,以及书本 232 页、 233 页定义的 sqrt-stream
:
;;; 64-sqrt.scm
(load "64-stream-limit.scm")
(load "p233-sqrt-stream.scm")
(define (sqrt x tolerance)
(stream-limit (sqrt-stream x) tolerance))
测试:
1 ]=> (load "64-sqrt.scm")
;Loading "64-sqrt.scm"...
; Loading "64-stream-limit.scm"... done
; Loading "p233-sqrt-stream.scm"...
; Loading "p232-sqrt-improve.scm"... done
; ... done
;... done
;Value: sqrt
1 ]=> (sqrt 9 0.0001)
;Value: 3.000000001396984