Scheme SICP练习3.62
我已经完成了练习3.59、3.60、3.61,并且在3.62时卡住了,所以我求助于 练习3.59和3.60可以用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.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))))