テイラーシリーズのスキームストリーミング
-
26-10-2019 - |
質問
私は宿題をしてきましたが、いくつかのコードを書きましたが、実際にそれが機能しない理由を見つけることができません。作業のこの部分の主なアイデアは、特定のXのコサイン関数のテイラーシリーズシリーズの要素を提供するストリームを作成することです(角度は推測します)。とにかくここに私のコードがあります、もし誰かがそれがうまくいかない理由を私に指し示すことができれば私は幸せです:)
(define (force exp) exp)
(define (s-car s) (car s))
(define (s-cdr s) (force (cdr s)))
; returns n elements of stream s as a list
(define (stream->list s n)
(if (= n 0)
'()
(cons (s-car s) (stream->list (s-cdr s) (- n 1)))))
; returns the n-th element of stream s
(define stream-ref (lambda (s n)
(if (= n 1)
(s-car s)
(stream-ref (s-cdr s) (- n 1)))))
; well, the name kinda gives it away :) make factorial n!
(define (factorial x)
(cond ((= x 0) 1)
((= x 1) 1)
(else (* x (factorial (- x 1))))))
; this function is actually the equation for the
; n-th element of Taylor series of cosine
(define (tylorElementCosine x)
(lambda (n)
(* (/ (expt -1 n) (factorial (* 2 n))) (expt x (* 2 n)))))
; here i try to make a stream of those Taylor series elements of cosine
(define (cosineStream x)
(define (iter n)
(cons ((tylorElementCosine x) n)
(lambda() ((tylorElementCosine x) (+ n 1)))))
(iter 0))
; this definition should bind cosine
; to the stream of taylor series for cosine 10
(define cosine (cosineStream 10))
(stream->list cosine 10)
; this should printi on screen the list of first 10 elements of the series
ただし、これは機能しません。理由はわかりません。
私はDr.Scheme 4.2.5を使用しており、言語は「プログラミング言語3番目のED」に設定されています。
解決
私は気分が良かったので(そしてスキームについてノスタルジックな)、私は実際にあなたのコードを通して、間違いを見つけるために歩いていました。私が見ることができるものから、コードが本来あるように実行されないようにする2つの問題があります。
私があなたのコードを正しく理解している場合 (force exp)
評価する必要があります exp
, 、しかし、あなたはそれを直接返します(未評価)。したがって、おそらく次のように定義する必要があります (define (force exp) (exp))
2番目の問題はあなたのラムダにあります: (lambda() ((tylorElementCosine x) (+ n 1)) )
Taylorシリーズの次の要素に評価しますが、ストリームに評価する必要があります。あなたはおそらくこのようなものが欲しいです: (lambda() (iter (+ n 1)) )
出力が正しいかどうかを確認していませんが、それらの変更により少なくとも実行されます。したがって、コードにそれ以上の問題がある場合、使用される式にあるはずです。
しかし、次回宿題を手伝うときは、少なくとも問題がどこに現れ、すでに試したことを教えてください(コミュニティは「ここにあるコードです、私のために修正してください」という質問のような質問をすることをお勧めします。 )。