方案:可能是SICP中的错字 1.3.2我对吗?

问题描述

在SICP(1.3.2。页面:62)中,有一种使用lambda查找pi-sum的解决方案。解决方案是:

(define (pi-sum a b)
  (sum (lambda (x) (/ 1.0 (* x (+ x 2))))
       a
       (lambda (x) (+ x 4))
       b))

但是,我觉得应该在((lambda (x) (+ x 4) b)后面加上一个括号。这样的程序会产生一个错误,指出sum期望number但得到procedure

修改上面的代码不会出错。

(define (pi-sum a b)
  (sum ((lambda (x) (/ 1.0 (* x (+ x 2))))
       a)
       ((lambda (x) (+ x 4))
       b)))

如果我的理解是错误的,请纠正我。我认为这本书是不会错的。

解决方法

本书中的pi-sum过程正在使用早于1.3.1中定义的高阶过程sumsum过程将ab作为描述求和范围的参数,并将termnext作为描述如何创建的参数a中的术语,以及如何从当前a中获取下一个atermnext都必须是过程。这是本书中sum的定义:

(define (sum term a next b)
  (if (> a b)
      0
      (+ (term a)
         (sum term (next a) next b))))

如果在pi-sum的定义中添加括号,则应该得到一个例外,因为sum需要四个参数,但是现在仅传递了两个。我不确定您为什么会收到错误消息,例如“ sum期望number却得到procedure ”,但是我怀疑您的情况有所不同sum的定义超出了本书的定义。

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...