2016-03-21 15 views
0

Ich muss ein einfaches Programm in Lisp schreiben, das ein Polynom um einen Faktor multipliziert. In diesem Beispiel möchte ich (x + 5) * 5x multiplizieren. Die Antwort sollte 5x^2 + 25x sein.Erhalte einen "schlechten Bindungsform" -Fehler in LISP

Wenn ich ((1 1) (5 0)) (5 1)) einstelle, sollte ich (5 2) (25 1) bekommen. Jedoch bekomme ich verschiedene Fehler im Bereich von undefined operator TERM in (TERM) und bad binding form. Ich bin ein Neuling bei Lisp und versuche, eine Liste wie oben gezeigt zurückzugeben. Unten ist mein kurzer Block des Codes:

(defun get-coef (term) 
    (car term)) 

(defun get-power (term) 
    (cadr term)) 

(defun make-term (coef power) 
    (cons coef power)) 

(defun poly-eval (poly factor) 
    (if (null poly) 0 
    (let ((term (car poly)) 
      (let (coef ((* (get-coef(term)) (get-coef(factor))))) 
       (power ((+ (cadr(term)) (cadr(factor))))) 
       (make-term (coef power)) 
       (poly-eval (cdr poly) factor)))))) 

Jede mögliche Hilfe wird geschätzt !!

Antwort

4

Mehrere Probleme mit Ihrem Code:

  1. Sie sind (fun (arg1 arg2)) Syntax. Es sollte (fun arg1 arg2) sein. Zum Beispiel schreiben Sie (make-term (coef power)), aber es sollte (make-term coef power) sein.

  2. Ihre Bindungen in let sind überall. Die korrekte Syntax lautet

    , d. H. Alle Bindungen sind in einer Liste und jede Bindung ist eine Liste von zwei Elementen. Beachten Sie, dass die Ausdrücke, an die die Variablen gebunden sind (e1 usw.), nicht in zusätzliche Klammern in Klammern eingeschlossen sind.

  3. make-term verwendet nicht die gleiche Darstellung wie get-power. In get-power verwenden Sie cadr, also müssen Sie sicherstellen, make-term setzt die power in die richtige Position.

  4. Ihr poly-eval eigentlich nicht (make-term coef power) mit dem rekursiven Aufruf zu (poly-eval (cdr poly) factor) kombinieren, so wird es verloren. Du solltest cons das "here" -Ergebnis zum "there" -Ergebnis haben.

  5. Ihre poly-eval gibt 0 statt der leeren Liste für leere Polynome zurück.

Alles in allem kann der Code als

(defun get-coef (term) 
    (car term)) 

(defun get-power (term) 
    (cadr term)) 

(defun make-term (coef power) 
    (list coef power)) 

(defun poly-eval (poly factor) 
    (if (null poly) nil 
    (let ((term (car poly))) 
     (let 
      ((coef (* (get-coef term) (get-coef factor))) 
      (power (+ (get-power term) (get-power factor)))) 
     (cons (make-term coef power) 
       (poly-eval (cdr poly) factor)))))) 

geben beispielsweise festgelegt werden

(poly-eval '((1 1) (5 0)) '(5 1)) 

was

((5 2) (25 1)) 
0

Ihr Make-Begriff verwendet CONS aber Ihre get-Leistung nimmt die CADR:

(defun get-Leistung (term) (CADR Begriff))

(defun machen Zeit (Koef Leistung) (cons COEF Macht))

Sie prolly wollte (Liste coef power).

(cons 'c' p) gibt zurück (c. P), nicht (c p).

Jetzt geht Ihre Macht für CADR, das CAR der CDR, aber die CDR ist 'p.

Ihre Eingaben sind Listen von Koeff und Macht zB (5 1), so scheint es das einzige Problem ist in Ihrem Make-Term.

Oder Sie können umkehren und konsistent sein mit ((5. 1) (5. 0) und dann ändern Sie die Leistung zu sein (cdr Begriff).