+ : ожидает тип в качестве 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 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? Он все еще должен вернуть число тогда, и прямо сейчас это не так.