Chapter 3, Modularity, Objects, and State
Exercise 3.75
Well, Louis is introducing quite subtle bugs/inefficiencies(as he did in ex-3.63) :)
What we need is to use average values when calling sign-change-detector.
Louis mixed the average value and the values coming from input-stream. He passed avpt
as last-value
which makes the calculation of avpt
wrong! Because avpt
is the average of two values of the input stream and not the average of current value of input-stream and previous avpt!
This bug is quite difficult to spot because the variable name(last-value) and the value it holds are not in sync. It claims to be a value of input-stream but contains avpt!
Here is the fixed code:
1
2
3
4
5
(define (make-zero-crossings input-stream last-value last-avpt)
(let ((avpt (/ (+ (stream-car input-stream) last-value) 2)))
(cons-stream (sign-change-detector avpt last-avpt)
(make-zero-crossings (stream-cdr input-stream)
(stream-car input-stream) avpt))))