SICP問題3.59

2010/02/24 cosine-seriesのコードを間違えていたので修正
a.
級数a_{0}+a_{1}x+a_{2}x^2+a_{3}+x-3+\cdots積分はcを任意の定数としてc+a_{0}x+\frac{1}{2}a_{1}x^2+\frac{1}{3}a_{2}x^3+\frac{1}{4}a_{3}x^4+\cdots
である
a_{0}+a_{1},a_{2},a_{3},\cdotsをとり、級数積分の定数項を除いた項の係数のストリームa_{0},\frac{1}{2}a_{1},\frac{1}{3}a_{2},\cdotsを返す手続きintegrate-seriesを定義する

(define (integrated-series s)
  (stream-map / s integers))

テスト

(stream-ref (integrated-series ones) 1)
; 1/2
(stream-ref (integrated-series ones) 2)
; 1/3
(stream-ref (integrated-series ones) 3)
; 1/4
(stream-ref (integrated-series ones) 4)
; 1/5
(stream-ref (integrated-series ones) 5)
; 1/6
(stream-ref (integrated-series ones) 6)
; 1/7

OK.

b.
関数x\mapsto e^xは同じ微分を持つ。つまりe^xe^x積分e^0 = 1の定数項を除いて同じ級数である。従ってe^x級数

(define exp-series
  (cons-stream 1 (integrate-series exp-series)))

で生成できる。正弦の微分余弦であり、余弦微分が正弦の符号を変えたものであるという事実から出発し、正弦と余弦級数を生成する方法を示せ、という問題で正直良く分からないのですが、書いてあるとおりに素直に実装。
余弦微分が正弦の符号を変えたもの → 正弦の積分の符号を変えたものが余弦

(define cosine-series
  (cons-stream 1 (stream-map - (integrated-series sine-series))))

正弦の微分余弦余弦積分が正弦

(define sine-series
  (cons-stream 0 (integrated-series cosine-series)))

という感じでOKかな?

以下はこの問題を解くのに必要な定義(教科書で定義)

(define integers (cons-stream 1 (add-streams ones integers)))
(define ones (cons-stream 1 ones))
(define (add-streams s1 s2)
  (stream-map + s1 s2))