Почему эта ошибка в моей программе Scheme Cube-Root появляется? - PullRequest
0 голосов
/ 09 декабря 2018

Итак, я прорабатываю SICP , и одной из проблем (1.8) является реализация процедуры с кубическим корнем, аналогичной процедуре с квадратным корнем, с использованием Ньютона-Рафсонаметод .Я написал программу и попытался выполнить ее, но получил эту ошибку: *: number required, but got #<Closure> [cubert, cubeiter, cubeiter, good-enough, cube, sq, *]

Это мой код:

(define (sq x)
  (* x x))
(define (cube x)
  (*(sq x) x))
(define (abs x) 
  (if (< x 0) 
    (-x) 
    x))
(define (good-enough guess x)
  (< (abs (- x (cube guess)) )0.0001))
(define (improve guess x)
  (- guess (/ (- (cube guess) 3) (* 3 (sq x)))))
(define (cubeiter guess x)
  (if (good-enough guess x)
       guess
       (cubeiter improve x)))
(define (cubert x) (cubeiter 1.0 x))

(cubert 27)

Может ли кто-нибудь объяснить, что означает эта ошибка и как я могу ее исправить?Это?что такое #<Closure>?

Заранее спасибо!

1 Ответ

0 голосов
/ 09 декабря 2018

#<Closure> - метод реализации представления объекта процедуры.Если x оценивает это, то (x ...) вызывает эту процедуру.Например.(+ 2 3) ; ==> 5, но + ; ==> #<Closure>.(+ - примитив, поэтому он может отображаться по-разному, но это действительно не имеет значения. Вы не должны его печатать :))

Я вижу, что вы звоните (cubeiter improve x), но это не таккажется правильным, что guess должна быть процедурой, так как начальный вызов проходит 1.0, который является числом.Очевидно, что один из них не прав.Возможно, вы должны были позвонить improve и получить результат, который будет передан cubeiter?например.(cubeiter (improve ...) x)

Также у вас есть ошибка в abs.(-x) - это не то же самое, что (- x), что является сокращением для (- 0 x).Вы вызываете процедуру с именем -x без аргументов.

Ошибка abs заставляет меня думать, что вы, возможно, не тестируете части своего кода.Если это не так, у вас будут проблемы, как только код станет больше.При создании cubeiter было бы неплохо знать, что используемые в нем процедуры работают и что ошибки, скорее всего, будут в cubeiter, а не improve, good-enough или abs.Весь смысл создания отдельных процедур состоит в том, чтобы иметь возможность тестировать части так, чтобы вы были уверены, что они работают, и чтобы вы перестали думать о его реализации при использовании его на более высоком уровне абстракции.

...