泰勒级数的方案流

时间:2012-01-10 17:44:27

标签: stream scheme taylor-series

我一直在做一些功课,写了一些代码,实际上找不到它不起作用的原因。这部分工作的主要思想是制作一个流,它将为给定的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,语言设置为“Essentials of Programming Languages 3rd ed”。

1 个答案:

答案 0 :(得分:3)

由于我感觉很好(并且对计划怀旧),我实际上已经通过你的代码来解决错误。从我所看到的有两个问题,使代码无法运行:

如果我正确理解您的代码(force exp)应该评估exp,但是您可以直接返回它(未评估)。所以它可能应该被定义为(define (force exp) (exp))

第二个问题出现在你的lambda中:(lambda() ((tylorElementCosine x) (+ n 1)) )将评估泰勒系列的下一个元素,而它应该评估为一个流。你可能想要这样的东西:(lambda() (iter (+ n 1)) )

我没有检查输出是否正确,但是这些修改至少会运行。因此,如果代码中存在任何问题,则应该在使用的公式中。

但是我建议下次你需要帮助完成你的作业时,至少要告诉我们问题的确切位置和你已经尝试过的东西(社区对此感到皱眉“这里有一些代码,请为我修好)问题)。