我必须在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))))))
任何帮助表示赞赏!!
答案 0 :(得分:5)
您的代码有几个问题:
您正在使用(fun (arg1 arg2))
语法。它应该是(fun arg1 arg2)
。例如,您编写(make-term (coef power))
但它应该是(make-term coef power)
。
let
中的绑定到处都是。正确的语法是
(let ((v1 e1)
(v2 e2)
(v3 e3))
e0)
即。所有绑定都在一个列表中,每个绑定都是两个元素的列表。请注意,变量绑定到的表达式(e1
等)不会包含在任何额外的括号中。
make-term
并未使用与get-power
相同的表示形式。在get-power
中,您使用cadr
,因此您需要确保make-term
将power
置于正确的位置。
您的poly-eval
实际上并未将(make-term coef power)
与(poly-eval (cdr poly) factor)
的递归调用合并,因此会丢失。你应该cons
"在这里" - 到#34;那里" -result。
您的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))
答案 1 :(得分:1)
你的假期使用CONS,但你的获取权力使用CADR:
(defun get-power(term)(cadr term))
(defun make-term(coef power)(cons coef power))
你非常想要(列出coef power)。
(cons'c'p)返回(c.p),而不是(c p)。
现在你的获取能力用于CADR,即CDR的CAR,但是CDR是'p。
您的输入是系数和电源的列表,例如(5 1),因此看起来唯一的问题是您的生产期限。
或者你可以转身并与((5.1)(5.0)保持一致,然后改变获得权力(cdr term)。
答案 2 :(得分: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)))))