+ : ожидает тип в качестве 2-го аргумента, заданного: #;
В настоящее время я работаю над упражнением 1.29 SICP, и моя программа продолжает выдавать мне следующую ошибку:
+: 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)
Я предполагаю, что "2-й аргумент" относится к месту, где я добавляю текущую итерацию и будущие итерации. Однако я не понимаю, почему этот второй аргумент не возвращает число. Кто-нибудь знает, как исправить эту ошибку?
2 ответа:
В вашей процедуре
iter
отсутствует пунктelse
. Спросите себя: что должно произойти, когда(<= 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
"2-й аргумент" относится ко второму аргументу
+
, который является выражением(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
? Он все еще должен вернуть число тогда, и прямо сейчас это не так.