Scheme +;:期望类型<;数量>;作为第二个参数,给定:#<;无效>;;

Scheme +;:期望类型<;数量>;作为第二个参数,给定:#<;无效>;;,scheme,racket,sicp,Scheme,Racket,Sicp,我目前正在进行SICP的练习1.29,我的程序不断给我以下错误: +:期望类型作为第二个参数,给定:#;其他参数为:970299/500000 下面是我使用racket运行的代码: (define (cube x) (* x x x)) (define (integral2 f a b n) (define (get-mult k) (cond ((= k 0) 1) ((even? k) 4) (else 2

我目前正在进行SICP的练习1.29,我的程序不断给我以下错误:

+:期望类型作为第二个参数,给定:#;其他参数为:970299/500000

下面是我使用
racket
运行的代码:

  (define (cube x)
    (* x x x))

  (define (integral2 f a b n)
    (define (get-mult k)
      (cond ((= k 0) 1)
            ((even? k) 4)
            (else 2)))
    (define (h b a n)
      (/ (- b a) n))
    (define (y f a b h k)
      (f (+ a (* k (h b a n)))))
    (define (iter f a b n k)
      (cond ((> n k)
             (+ (* (get-mult k)
                   (y f a b h k))
                (iter f a b n (+ k 1))))))
    (iter f a b n 0))

(integral2 cube 0 1 100)

我猜“第二个参数”是指我添加当前迭代和未来迭代的位置。然而,我不明白为什么第二个参数没有返回一个数字。有人知道如何纠正此错误吗?

您的
iter
过程中缺少了
else
子句。扪心自问:当
(“第二个参数”指的是
+
的第二个参数,即表达式
(iter f a b n(+k 1))
时会发生什么。根据错误消息,该表达式的计算结果是无效的,而不是有意义的值。为什么会是这种情况

呃,
iter
的整个主体是这个
cond
表达式:

(cond ((> n k)
       (+ (* (get-mult k)
             (y f a b h k))
          (iter f a b n (+ k 1)))))

在什么情况下,这个表达式不会计算为一个数字?那么,这个表达式做什么呢?它检查
n
是否大于
k
,在这种情况下,它返回一个加法的结果,它应该是一个数字。但是如果
n
小于
k
或等于
k
,它仍然是一个数字然后需要返回一个数字,而现在不是。

最好是您提供的代码是自包含的,因此您应该包含
cube的定义
,这样您的示例就可以运行。h是一个常量,在包含所需的b和n值的闭包中定义。您的定义可以重写为不使用任何参数。y only需要k,而iter只需要k和n。你已经忘记了iter中n=k的情况,你已经忘记了算法框架的(*(/h3)求和项)部分不允许单臂
if
s。你必须提供一个
else
表达式(或者在
时使用
,如果你想生效的话)。这很好,因为它可以帮助您抓住错误。不幸的是,Racket允许在没有
else
的情况下执行
cond
,并且它不能帮助您抓住类似的错误。
(cond ((> n k)
       (+ (* (get-mult k)
             (y f a b h k))
          (iter f a b n (+ k 1)))))