Exercise 3.53 - 3.55
3.5.2 節は無限ストリーム。素数のストリームが出てきましたが、project euler にもどるのは stream を読み終えてからにしよう。
「無限ストリーム」って名前が格好いい。
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.
まずは無限ストリームの要素を掛け合わせる 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.
引数として与えたストリームの級数列を返す手続き 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 なんですね。