理系学生日記

おまえはいつまで学生気分なのか

問題3-54 (3.5.2 Infinite Streams)

目的は n 番目の要素が (n+1)! になるような無限ストリーム factorials を作成すること.

まずは,2 つのストリームを掛け合わせる

まずは,2 つのストリームを掛け合わせて,新しい無限ストリームを作るような関数 mul-stream をこさえます.

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

こさえると言っても,add-stream の演算子を変えただけだし,このあたりになると add-stream と mul-stream の共通部分を括り出してもよさそうな気がしますね! SICP でもたしか第一章で似たような話をやってたなー.

そして目的の無限ストリーム factorials を作る

; n から始まる整数の無限ストリームを構成
(define (integers-starting-from n)
  (cons-stream n (integers-starting-from (+ n 1))))

; ゴール
(define factorials
  (cons-stream 1
               (mul-stream factorials
                           integers))))

(stream-car factorials)     ; 1
(stream-cadr factorials)    ; 1
(stream-caddr factorials)   ; 2
(stream-cadddr factorials)  ; 6