我目前正在研究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)
我猜测“第二个参数”是指我添加当前迭代和未来迭代的地方。但是,我不明白为什么第二个参数没有返回一个数字。有谁知道如何解决这个错误?
答案 0 :(得分: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
怎么办?它仍然需要返回一个数字,而现在它不是。
答案 1 :(得分: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