1

我必须在 Lisp 中编写一个简单的程序,将多项式乘以某个因子。在这个例子中,我想乘(x + 5) * 5x。答案应该是5x^2 + 25x

当我投入时,((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

3 回答 3

6

您的代码有几个问题:

  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))
于 2016-03-21T03:05:33.007 回答
1

您的 make-term 使用 CONS,但您的 get-power 使用 CADR:

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

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

您需要(列出 coef 功率)。

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

现在你的权力去 CADR,CDR 的 CAR,但 CDR 是'p。

您的输入是系数和功率列表,例如 (5 1),因此看来唯一的问题出在您的制造术语中。

或者你可以转身与 (( 5 . 1)(5 . 0) 保持一致,然后将 get power 更改为 (cdr term)。

于 2016-03-25T13:04:10.513 回答
0

另一种方式:

(defun mult(term factor)
  (list (* (first term) (first factor))  (+ (second term) (second factor))))

(defun polyeval(poly factor)
  (cond
     ((null poly) nil)   
     (t (cons (mult (first poly) factor) (polyeval (rest poly) factor)))))
  • 注意:first=car,rest=cdr,second=cadr
于 2020-10-29T18:10:06.890 回答