2017-02-18 1 views
0

SchemeQuadratic Formel in Schema

I eine Funktion definieren will, die die Wurzeln der quadratischen Formel gibt, da ax^2 + bx + c = 0 ist. Gib nur echte Wurzeln zurück. Die Liste wird 0, 1 oder zwei eindeutige Wurzeln haben.

(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 ('()')) 
    ) 
) 

Ich habe

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

Gibt es einen besseren Weg, das zu lösen?

+0

@jenesaisquoi der 'list' ist nicht zufällig, OP verwendet er eine Liste zurückzukehren mit den Antworten. –

Antwort

0

Sie haben Klammern Probleme (offensichtlich, das ist, was der Fehler angibt) - zum Beispiel haben Sie vergessen, eine links von der zweiten list in Ihrem Code zu öffnen. Dies sollte es beheben:

(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 '()))) 

Auch beachten Sie die richtige Art und Weise Ihren Code einrücken - es wird Ihnen Fehler wie diese finden helfen; Ein guter Editor wird auch nützlich sein. Lassen Sie uns das Verfahren testen:

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

Danke! Ich verwende Xcode, das wie ein Notizblock für Schema – Morovo

+1

@Morovo DrRacket ist, würde einen erheblich besseren Job machen und Sie können es einstellen, um die großen Systemstandards zu unterstützen. – Sylwester

0

Die vorherige Lösung antwortet richtig auf Ihre Frage. Beachten Sie jedoch, dass Ihr Algorithmus die gleiche Berechnung oft durchführt, auch wenn dies nicht notwendig ist (wenn die Determinante Null ist) und der Code sehr schwer zu lesen ist. Also habe ich ein Umschreiben Ihrer Funktion vorzuschlagen, um das gleiche Ergebnis erzeugt effizienter und, wichtiger noch, in einem besser lesbaren Art und Weise:

(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))))))))