2016-03-21 7 views
0

Мне нужно написать простую программу в Lisp, которая умножает многочлен на некоторый коэффициент. В этом примере я хочу умножить (x + 5) * 5x. Ответ должен быть 5x^2 + 25x.Получение ошибки «плохой привязки» в LISP

Когда я положил ((1 1) (5 0)) (5 1)), я должен был получить (5 2) (25 1). Тем не менее, я получаю различные ошибки от undefined operator TERM in (TERM) и bad binding form. Я новичок в Lisp и пытаюсь вернуть список, как показано выше. Ниже мой короткий блок кода:

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

Любая помощь приветствуется!

ответ

4

Несколько проблем с кодом:

  1. Вы используете (fun (arg1 arg2)) синтаксис. Это должно быть (fun arg1 arg2). Например, вы пишете (make-term (coef power)), но это должно быть (make-term coef power).

  2. Ваши привязки в let повсюду. Правильный синтаксис

    (let ((v1 e1) 
         (v2 e2) 
         (v3 e3)) 
        e0) 
    

    т.е. все привязки в одном списке, и каждый связывающий представляет собой список из двух элементов. Обратите внимание, что выражения, привязанные к переменным (e1 и т. Д.), Не обматываются никакими дополнительными слоями круглых скобок.

  3. make-term не использует то же представление, что и get-power. В get-power вы используете cadr, поэтому вам нужно убедиться, что make-term помещает power в нужное положение.

  4. Ваш poly-eval фактически не объединить (make-term coef power) с рекурсивным вызовом (poly-eval (cdr poly) factor), поэтому он теряется. Вы должны cons «здесь» - результат «там» - результат.

  5. Ваш poly-eval возвращает 0 вместо пустого списка для пустых многочленов.

В общем, ваш код может быть зафиксирован в

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

давая, например,

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

в результате

((5 2) (25 1)) 
0

Ваш макияж перспективе использует CONS но прибудете сила берет CADR:

(DEFUN получить мощности (термин) (термин CADR))

(DEFUN сделать перспективе (коэффициент мощности) (против коэф мощности))

Вы очень хотели (список коэф. Мощности).

(cons 'c' p) возвращается (c. P), а не (c p).

Теперь ваш источник питания для CADR, CAR CDR, но CDR - это «p.

Ваши входы: перечисляет of coeff и power eg (5 1), поэтому, похоже, единственная проблема заключается в вашем сроке действия.

Или вы можете обойтись и соответствовать ((5. 1) (5. 0), а затем изменить мощность питания (cdr term).