Exercise 3.53 - 3.55

3.5.2 節は無限ストリーム。素数のストリームが出てきましたが、project euler にもどるのは stream を読み終えてからにしよう。

「無限ストリーム」って名前が格好いい。

Exercise 3.53.

Exercise 3.53.

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

が何を定義しているかという問題。

s の最初の要素は 1 なので (add-streams s s) の最初の要素は 1 + 1 = 2 となる。
次の要素は 2 + 2 = 4, 4 + 4 = 8...。つまり s は 1, 2, 4, 8, 16, 32 という 2 のべき乗の無限ストリーム。

Exercise 3.54.

Exercise 3.54.

まずは無限ストリームの要素を掛け合わせる mul-streams を定義する。add-streams が

(define (add-streams s1 s2) (stream-map + s1 s2))

なので、mul-streams は

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

となる。
次に mul-streams をつかって、階乗の無限ストリーム factorials を定義する。

factorial は

factorial(n-1)   1 2  6  24 120 ...
n + 1            2 3  4   5   6 ...
---------------------------------------------
factorials(n)  1 2 6 24 120 720    

と表すことができるから、これをストリームで表せば

(define factorial (cons-stream 1 (mul-streams (stream-cdr integers) factorial)))

となる。

Exercise 3.55.

Exercise 3.55.

引数として与えたストリームの級数列を返す手続き partial-sums を考える問題。

ここでは引数を integers として考えます。 partial-sum は

partial-sums(n-1)   1 3  6 10 15 21 28 36 45 ...
integer           1 2 3  4  5  6  7  8  9 10 ...
------------------------------------------------
partial-sums(n)   1 3 6 10 15 21 28 36 45 55 ...

と表すことができるから

(define (partial-sum s) 
  (cons-stream (stream-car s) 
               (add-streams (stream-cdr s) (partial-sum s))))

となる。

gauche だと cons-stream ではなくて、stream-cons なんですね。