SICP問題3.76

各要素が入力ストリームの二つの連続する要素の平均であるストリームを生じる手続きsmoothの定義

(define (smooth input-stream)
  (define (iter s)
    (cons-stream (/ (+ (stream-car s)
                       (stream-car (stream-cdr s))) 2)
                 (iter (stream-cdr s))))
  (cons-stream 0 (iter input-stream)))

テスト

(stream-ref-range (smooth sense-data) 0 10)
; 0
; 3/2
; 1.75
; 1.25
; 0.75
; 0.2
; -1.05
; -5/2
; -5/2
; -1.25
; #<undef>

元々のmake-zero-crossings(教科書で定義)を使用してzero-crossingsを再定義

(define (make-zero-crossings input-stream last-value)
  (cons-stream
   (sign-change-detector (stream-car input-stream) last-value)
   (make-zero-crossings (stream-cdr input-stream)
                        (stream-car input-stream))))
(define zero-crossings (make-zero-crossings (smooth sense-data) 0))

テスト

(stream-ref-range zero-crossings 0 20)
; 0
; 0
; 0
; 0
; 0
; 0
; -1
; 0
; 0
; 0
; 0
; 1
; 0
; 0
; 0
; 0
; 0
; 0
; 0
; -1
; #<undef>