2017-02-18 9 views
0

СхемаКвадратичные Формула на схеме

Я хочу, чтобы определить функцию, которая возвращает корни квадратичной формулы, поскольку ах^2 + BX + C = 0. Верните только реальные корни. В списке будут есть 0, 1 или два уникальных корня.

(define (quadratic a b c) 
    (cond 
     ((> (- (* b b) (* 4 (* a c))) 0) (list (/ (- (sqrt (- (* b b) (* (* 4 a) c))) b) (* 2 a)) 
      (/ (- (- (sqrt (- (* b b) (* (* 4 a) c)))) b) (* 2 a)))) 
     ((= (- (* b b) (* 4 (* a c))) 0) list(/ (- (sqrt (- (* b b) (* (* 4 a) c))) b) (* 2 a))) 
     (else ('()')) 
    ) 
) 

Я получил

error: unexpected right parenthesis [read] 
     #{&read-error} 
     #{&i/o-port-error #{input-port #{input-channel "standard input" 0}}} 

Есть ли лучший способ решить это?

+0

@jenesaisquoi в 'list' не случайно, OP использует его, чтобы вернуть список с ответами. –

ответ

0

У вас проблемы с круглыми скобками (очевидно, это то, о чем говорит ошибка) - например, вы забыли открыть один из них слева от второго list в своем коде. Это должно исправить:

(define (quadratic a b c) 
    (cond 
    ((> (- (* b b) (* 4 (* a c))) 0) 
    (list (/ (- (sqrt (- (* b b) (* (* 4 a) c))) b) (* 2 a)) 
      (/ (- (- (sqrt (- (* b b) (* (* 4 a) c)))) b) (* 2 a)))) 
    ((= (- (* b b) (* 4 (* a c))) 0) 
    (list (/ (- (sqrt (- (* b b) (* (* 4 a) c))) b) (* 2 a)))) 
    (else '()))) 

Кроме того, обратите внимание на правильном пути, чтобы отступы вашего кода - это поможет вам найти ошибки, как это; хороший редактор тоже будет полезен. Давайте проверим процедуру:

(quadratic 1 -3 -4) 
=> '(4 -1) 
(quadratic 9 12 4) 
=> '(-2/3) 
(quadratic 3 4 2) 
=> '() 
+1

Спасибо! Я использую Xcode, который похож на блокнот для схемы – Morovo

+1

@Morovo DrRacket будет выполнять значительно лучшую работу, и вы можете настроить его для поддержки основных стандартов схемы. – Sylwester

0

Предыдущее решение правильно отвечает на ваш вопрос. Но учтите, что ваш алгоритм выполняет одни и те же вычисления много раз, даже если это не обязательно (когда детерминант равен нулю), а код очень трудно читать. Поэтому я предлагаю переписывание вашей функции, которая производит тот же результат, более эффективно и, что более важно, в более читаемом виде:

(define (quadratic a b c) 
    (let ((determinant (- (* b b) (* 4 a c)))) 
    (if (negative? determinant) 
     '() 
     (let ((a2 (+ a a))) 
      (if (zero? determinant) 
       (list (/ (- b) a2)) 
       (let ((root (sqrt determinant))) 
       (list (/ (- root b) a2) 
         (/ (- (- root) b) a2))))))))