問題3-53〜55

「3.5.2 無限ストリーム」に入りました。こういう風にリストを定義すると、永遠に続く配列を表現できるということが驚きでした。このトピックは問題がたくさんあるので、それらを解きながら、理解を深めていきたいと思います。
問題3-53。stream-carの値を足し合わせた値が、stream-cdrになるようなストリームですので、

(define s (cons-stream 1 (add-streams s s)))

は、1, 2, 4, 8, 16, 32と続くストリームだということになります。
問題3-54。mul-streamを

(define (mul-stream s1 s2)
  (stream-map * s1 s2))

と定義し、それとintegersを組み合わせて、階乗ストリームを作り出します。

(define factorials 
  (cons-stream 1 (mul-stream integers factorials)))

(stream-ref factorials 0)  ;=>1
(stream-ref factorials 1)  ;=>1
(stream-ref factorials 2)  ;=>2
(stream-ref factorials 3)  ;=>6
(stream-ref factorials 4)  ;=>24
(stream-ref factorials 5)  ;=>120

問題3-55。渡されたストリームの要素を先頭から足し合わせたストリームであるpartial-sumsを定義します。

(define (partial-sums stream)
  (cons-stream (stream-car stream)
               (add-streams (stream-cdr stream)
                            (partial-sums stream))))

(define s1 (partial-sums integers))

(stream-ref s1 0)  ;=>1
(stream-ref s1 1)  ;=>3
(stream-ref s1 2)  ;=>6
(stream-ref s1 3)  ;=>10
(stream-ref s1 4)  ;=>15

わかったような、わかっていないような不思議な感覚に陥ってしまうのが現状ですが、量をこなしながら慣れていくしかないのかなと感じています。