2

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

+: expects type <number> as 2nd argument, given: #<void>; other arguments were: 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)

我猜“第二个参数”是指我添加当前迭代和未来迭代的地方。但是,我不明白为什么第二个参数没有返回数字。有谁知道如何纠正这个错误?

4

2 回答 2

5

“第二个参数”是指 的第二个参数+,即表达式(iter f a b n (+ k 1))。根据错误消息,该表达式的计算结果为 void,而不是有意义的值。为什么会这样?

好吧,整个主体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怎么办?它仍然需要返回一个数字,而现在它不是。

于 2013-06-02T23:56:53.627 回答
3

您的程序else中缺少一个子句iter。问问自己:什么时候应该发生(<= n k)?这是递归的基本情况,它也必须返回一个数字!

(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))))
        (else <???>))) ; return the appropriate value
于 2013-06-02T23:47:40.950 回答