Что я делаю не так со Схемой? - PullRequest
2 голосов
/ 31 июля 2010

Когда я ввожу следующее:

(define (root a b c)
   (/ (+ (-b) (sqrt (- (exp b 2) (* 4 a c)))) (* 2 a)))

и затем ввожу:

(root 3 6 2)

Я получаю сообщение о том, что процедура имеет два аргумента, но требует только один.Что я делаю не так?

Ответы [ 3 ]

4 голосов
/ 31 июля 2010

Функция exp на самом деле не делает экспоненты, она делает что-то еще математическое.(Я не знаю.)

То, что вы хотите, обычно называется pow для "мощности", но, вероятно, не определено в вашей среде, поэтому я предлагаю вам просто определить свой собственный метод square:

(define (square x) (* x x))

А затем:

(define (root a b c)
   (/ (+ (- b) (sqrt (- (square b) (* 4 a c)))) (* 2 a)))

Редактировать: О, вам также придется изменить пару вопросов, таких как (* 4 a c) вместо (*4 a c) и (- b) вместо (-b).Вы всегда должны отделять оператор от операндов с пробелами.

1 голос
/ 09 апреля 2012

Процедура exp возводит число e в степень своего аргумента, если вам нужно поднять аргумент в силу другого аргумента, используйте expt.Еще лучше, учитывая, что вам нужно только поставить квадрат b, подойдет простое умножение.Как это:

(define (root a b c)
   (/ (+ (- b) (sqrt (- (* b b) (* 4 a c))))
      (* 2 a)))
0 голосов
/ 02 августа 2010

Функция, к которой относится ошибка, это exp, которая принимает только один аргумент.Функция exp вычисляет экспоненциальную функцию, а не экспоненту.Вы хотите expt, который поднимает корень x к показателю y:

(expt b 2)

Вы также можете просто умножить число на себя.

Я обычно держу под рукой R5RS или Язык программирования схем , так как эти основные функции трудно поддерживать прямыми.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...