我做了一些功课,写了一些代码,但实际上找不到它不起作用的原因。这部分工作的主要思想是制作一个流,为我提供给定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,语言设置为"编程语言基础第三版"。
因为我感觉很好(也很怀念scheme),所以我真的仔细检查了你的代码,找出了错误。据我所见,有两个问题使代码无法正常运行:
如果我正确理解您的代码,(force exp)
应该评估exp
,但是您直接返回它(未评估)。所以它可能应该被定义为(define (force exp) (exp))
第二个问题在lambda中:(lambda() ((tylorElementCosine x) (+ n 1)) )
将计算为泰勒级数的下一个元素,而它应该计算为流。你可能想要这样的东西:(lambda() (iter (+ n 1)) )
我还没有检查输出是否正确,但经过这些修改,它至少可以运行。因此,如果代码还有任何问题,应该在所使用的公式中。
然而,我建议下次你在家庭作业方面需要帮助时,至少告诉我们问题的具体表现和你已经尝试过的内容(社区确实对"这里有一些代码,请帮我解决"之类的问题表示不满)。