2016-03-21 43 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-termpower置於正確的位置。

  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

你的化妝長期使用缺點,但是你的GET功率取CADR:

(defun定義得到功率(項)(CADR項))

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

你需要(列表係數)。

(cons'c'p)返回(c。p),而不是(c p)。

現在你的獲得力量來自CADR,CDR的CAR,但CDR是'p。

你的輸入是列表 coeff和權力,例如(5 1),所以它似乎唯一的問題是在你的make-term。

或者你可以轉身並且與((5.1)(5.0))一致,然後改變獲得的力量(cdr term)