Scheme SICP练习3.62

Scheme SICP练习3.62,scheme,sicp,Scheme,Sicp,我已经完成了练习3.59、3.60、3.61,并且在3.62时卡住了,所以我求助于 练习3.59和3.60可以用正弦和余弦情况轻松测试,但不是3.61或3.62 社区提供的3.62代码在正确的正弦和余弦序列的条件下产生所有零正切序列: > (display-stream-until sine-series 7) 0 1 0 -1/6 0 1/120 0 > (display-stream-until cosine-series 7) 1 0 -1/2 0 1/24 0 -1/720

我已经完成了练习3.59、3.60、3.61,并且在3.62时卡住了,所以我求助于

练习3.59和3.60可以用
正弦
余弦
情况轻松测试,但不是3.61或3.62

社区提供的3.62代码在正确的
正弦
余弦
序列的条件下产生所有零
正切
序列:

> (display-stream-until sine-series 7)
0
1
0
-1/6
0
1/120
0

> (display-stream-until cosine-series 7)
1
0
-1/2
0
1/24
0
-1/720

> (display-stream-until tangent-series 7)
0
0
0
0
0
0
0
起初,我认为我在以前的练习中编写的代码可能是错误的,所以我将我的3.59/3.60/3.61的解决方案与社区上的解决方案进行了比较,结果表明我们产生了相同的结果

我尝试将//的代码复制到我的IDE(DrRacket)中,但
切线
序列仍然打印为全零

代码如下:

(define (mul-series s1 s2)
  (cons-stream (* (stream-car s1)
                  (stream-car s2))
               (add-streams (mul-streams (stream-cdr s1)
                                         (stream-cdr s2))
                            (mul-series s1 s2))))

(define (reciprocal-series s)
  (cons-stream 1
               (scale-stream (mul-series (stream-cdr s)
                                         (reciprocal-series s))
                             -1)))

(define (div-series s1 s2)
  (let ((c (stream-car s2)))
    (if (= c 0)
        (error "constant term of s2 can't be 0!")
        (scale-stream
         (mul-series s1
                     (reciprocal-series (scale-stream s2
                     (/ 1 c))))
     (/ 1 c)))))

(define tangent-series
  (div-series sine-series
              cosine-series))
及其所需部分:(太长,无法用身体突出显示)

谁能告诉我我的代码出了什么问题,或者可能的错误隐藏在哪里

顺便问一下,你们怎么在SICP上验证你们的代码

我发现了几个blog/github存储库,它们提供的代码没有(足够的测试用例)


我很难用简单的代码来处理这样的数学问题。

问题在于
mul系列

[a0+a1x+…]系列和[b0+b1x+…]系列的产品是
[a0b0+(a0b1+a1b0)x+…]
但是您的
mul系列
产生了
(cons流a0b0(添加流(多个流(cdr s1)(cdr s2))(多个系列s1 s2)))
=(反对流a0b0(添加流[a1b1,…][a0b0,…]))
=[a0b0,a1b1+a0b0,…]

您可以使用标识sin(x)2+cos(x)2=1(如练习3.60中建议的)检查mul系列

要尝试的其他一些简单测试用例是
[2] *[0+x]=[0+2x]
[1+x]*[1+x]=[1+2x+1x2]

使用适当的帮助函数,您的测试可以如下所示:

> (show-series (add-streams (mul-series sine-series sine-series) (mul-series cosine-series cosine-series)))
1 + 0*x + 0*x^2 + ...
> (show-series (mul-series (make-series '(2)) (make-series '(0 1))))
0 + 2*x + ...
> (show-series (mul-series (make-series '(1 1)) (make-series '(1 1))))
1 + 2*x + 1*x^2 + ...
以下是我定义的帮助器函数:

(define zeroes (cons-stream 0 zeroes))

;; make-series takes a list of numbers and returns an infinite stream
;; with those numbers followed by 0's
(define (make-series coeffs)
  (if (null? coeffs)
      zeroes
      (cons-stream (car coeffs) (make-series (cdr coeffs)))))

;; show-stream prints the first 10 items in a stream
(define (show-stream stream)
  (begin (show-stream-helper stream 10)))

(define (show-stream-helper stream n)
  (if (= 0 n)
      (begin (display "...")
             (newline))
      (begin (display (stream-car stream))
             (display ", ")
             (show-stream-helper (stream-cdr stream) (- n 1)))))

;; show-series is like show-stream, but uses the format a0 + a1*x + ...
(define (show-series stream)
  (show-series-helper stream 0 10))

(define (show-series-helper stream n m)
  (if (> n m)
      (begin (display "...")
             (newline))
      (begin (show-monomial (stream-car stream) n)
             (display " + ")
             (show-series-helper (stream-cdr stream) (+ 1 n) m))))

;; show-monomial displays a*x^n
(define (show-monomial coeff pow)
  (cond
   ((= 0 pow)
    (display coeff))
   ((= 1 pow)
    (display coeff)
    (display "*x"))
   (else
    (display coeff)
    (display "*x^")
    (display pow))))

我对你的代码感到困惑:
(mul series sine series sine series sine series)
,你是否省略了
x部分(x,x^2,x^3…?)
sine series是一个数字流[0,1,0,-1/6…],代表幂级数[0+1*x+0*x^2+(-1/6)*x^3+…]。x是隐式的。
(mul series sine series sine series)
的结果是一个具有sin(x)^2幂级数系数的流。结果表明,sin(x)^2=x^2+(-1/3)*x^4+(2/45)*x^6+。。。因此
(mul series sine series sine series)
返回流[0,0,1,0,-1/3,0,2/45,…]。我的助手函数
show series
类似于
display stream
,除了它在一行上打印所有内容,并使用
*x^n
提醒我们流中的每个数字代表幂级数中的一个系数。我想我把
mul-streams
mul-series
(define zeroes (cons-stream 0 zeroes))

;; make-series takes a list of numbers and returns an infinite stream
;; with those numbers followed by 0's
(define (make-series coeffs)
  (if (null? coeffs)
      zeroes
      (cons-stream (car coeffs) (make-series (cdr coeffs)))))

;; show-stream prints the first 10 items in a stream
(define (show-stream stream)
  (begin (show-stream-helper stream 10)))

(define (show-stream-helper stream n)
  (if (= 0 n)
      (begin (display "...")
             (newline))
      (begin (display (stream-car stream))
             (display ", ")
             (show-stream-helper (stream-cdr stream) (- n 1)))))

;; show-series is like show-stream, but uses the format a0 + a1*x + ...
(define (show-series stream)
  (show-series-helper stream 0 10))

(define (show-series-helper stream n m)
  (if (> n m)
      (begin (display "...")
             (newline))
      (begin (show-monomial (stream-car stream) n)
             (display " + ")
             (show-series-helper (stream-cdr stream) (+ 1 n) m))))

;; show-monomial displays a*x^n
(define (show-monomial coeff pow)
  (cond
   ((= 0 pow)
    (display coeff))
   ((= 1 pow)
    (display coeff)
    (display "*x"))
   (else
    (display coeff)
    (display "*x^")
    (display pow))))