課題 a
という無限ストリームが与えられたとき, を返す関数 integrate-series を作成します.なんでこの関数が integrate-series という名前になっているかというと, の積分が となり,その積分の係数が返されているからですね (定数項は除く).
(define (add-stream s1 s2) (stream-map + s1 s2)) (define integers (cons-stream 1 (add-stream ones integers))) (define (integrate-series S) (stream-map / S integers))
ここでは,ones () を渡してみます.
(define S (integrate-series ones)) (dump-stream S 5) ;1, 1/2, 1/3, 1/4, 1/5, done
ふむ,いい感じだ.
課題 b
(define exp-series (cons-stream 1 (integrate-series exp-series)))
上の関数を見るとなんとなくわかるかもしれないですが, と は定数項 (積分定数) 以外は同じですから, をマクローリン展開したときの数列は上記のように書ける.
じゃぁ,, をマクローリン展開したときのも書いてみようよ!
(define cosine-series (cons-stream 1 (integrate-series (stream-map (lambda (x) (* x -1)) sine-series)))) (define sine-series (cons-stream 0 (integrate-series cosine-series)))
ですし, ですから,上記のような定義で数列は完成するはずだ.
(dump-stream cosine-series 10) ; 1, 0, -1/2, 0, 1/24, 0, -1/720, 0, 1/40320, 0, done (dump-stream sine-series 10) ; 0, 1, 0, -1/6, 0, 1/120, 0, -1/5040, 0, 1/362880, done