From SICP:
Exercise 3.64. Write a procedure stream-limit that takes as arguments a stream and a number (the tolerance). It should examine the stream until it finds two successive elements that differ in absolute value by less than the tolerance, and return the second of the two elements. Using this, we could compute square roots up to a given tolerance by
(define (sqrt x tolerance)
(stream-limit (sqrt-stream x) tolerance))
I wrote this answer:
(define (stream-limit s tol)
(if (stream-null? s)
(error "End of stream found before limit reached:" tol)
(let* ((a (stream-car s))
(b (stream-car (stream-cdr s)))
(diff (abs (- a b))))
(if (> tol diff) b (stream-limit (stream-cdr s) tol)))))
Can it be improved?
2 Answers 2
Looks good. Is it OK to just say it looks good? If it's not, here are two comments:
- Why do you use
let*
here? Isn'tlet
enough? - You could define
stream-cadr
.
-
3\$\begingroup\$ The initializer for
diff
uses the values ofa
andb
. Sincelet
doesn't create the variable bindings until after evaluating all of the initializer expressions, it won't work here. \$\endgroup\$rob mayoff– rob mayoff2012年12月04日 23:44:54 +00:00Commented Dec 4, 2012 at 23:44
Looks fine to me. I would only suggest changing (> tol diff)
to (< diff tol)
because it reads more like the problem specification and is easier to understand.