得到一个;“装订不良”;LISP中的错误
我必须用Lisp编写一个简单的程序,将多项式乘以某个因子。在这个例子中,我想乘以(x+5)*5x。答案应该是5x^2+25x 当我输入得到一个;“装订不良”;LISP中的错误,lisp,common-lisp,lispworks,Lisp,Common Lisp,Lispworks,我必须用Lisp编写一个简单的程序,将多项式乘以某个因子。在这个例子中,我想乘以(x+5)*5x。答案应该是5x^2+25x 当我输入((11)(50))(51))时,我应该得到(52)(51)。然而,我遇到了各种各样的错误,从(TERM)中的未定义的运算符TERM到糟糕的绑定形式。我是Lisp的新手,试图返回一个列表,如上图所示。下面是我的一小段代码: (defun get-coef (term) (car term)) (defun get-power (term) (cadr t
((11)(50))(51))
时,我应该得到(52)(51)
。然而,我遇到了各种各样的错误,从(TERM)中的未定义的运算符TERM到糟糕的绑定形式。
我是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))))))
感谢您的帮助 您的代码有几个问题:
您正在使用(fun(arg1 arg2))
语法。它应该是(有趣的arg1 arg2)
。例如,您编写了(make term(coef power))
,但它应该是(make term coef power)
您在let
中的绑定到处都是。正确的语法是
(let ((v1 e1)
(v2 e2)
(v3 e3))
e0)
i、 所有绑定都在一个列表中,每个绑定都是两个元素的列表。请注意,变量绑定到的表达式(e1
等)没有包装在任何额外的括号层中
make term
与get power
使用的表示法不同。在get power
中,您使用cadr
,因此需要确保make term
将power
置于正确的位置
您的poly eval
实际上并没有将(make term coef power)
与递归调用(poly eval(cdr poly)factor)
相结合,因此它会丢失。您应该cons
将“这里”结果转换为“那里”结果
您的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))
您的代码有几个问题:
您正在使用(fun(arg1 arg2))
语法。它应该是(有趣的arg1 arg2)
。例如,您编写了(make term(coef power))
,但它应该是(make term coef power)
您在let
中的绑定到处都是。正确的语法是
(let ((v1 e1)
(v2 e2)
(v3 e3))
e0)
i、 所有绑定都在一个列表中,每个绑定都是两个元素的列表。请注意,变量绑定到的表达式(e1
等)没有包装在任何额外的括号层中
make term
与get power
使用的表示法不同。在get power
中,您使用cadr
,因此需要确保make term
将power
置于正确的位置
您的poly eval
实际上并没有将(make term coef power)
与递归调用(poly eval(cdr poly)factor)
相结合,因此它会丢失。您应该cons
将“这里”结果转换为“那里”结果
您的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))
你的make术语使用CONS,但你的get power使用CADR:
(得权(期限)(cadr期限))
(如有必要,请指定条款(coef power)(cons coef power))
你可能想要(列出coefpower)
(cons'c'p)返回(c.p),而不是(c.p)
现在,您的get动力用于CDR的汽车CADR,但CDR是'p'
你的输入是系数和功率的列表,例如(51),所以看起来唯一的问题是你的制造术语
或者,您也可以转身与((5.1)(5.0)保持一致,然后将get power更改为be(cdr术语)。您的make术语使用CONS,但get power使用CADR:
(得权(期限)(cadr期限))
(如有必要,请指定条款(coef power)(cons coef power))
你可能想要(列出coefpower)
(cons'c'p)返回(c.p),而不是(c.p)
现在,您的get动力用于CDR的汽车CADR,但CDR是'p'
你的输入是系数和功率的列表,例如(51),所以看起来唯一的问题是你的制造术语
或者,您可以转过身来,与((5.1)(5.0)保持一致,然后将get power更改为(cdr术语)。另一种方式:
(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)))))
- 注:第一个=汽车,其余=cdr,第二个=cadr
另一种方式:
(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)))))
- 注:第一个=汽车,其余=cdr,第二个=cadr