我必须在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))))))
Run Code Online (Sandbox Code Playgroud)
任何帮助表示赞赏!!
您的代码有几个问题:
您正在使用(fun (arg1 arg2))语法.它应该是(fun arg1 arg2).例如,你写,(make-term (coef power))但它应该(make-term coef power).
你的绑定let到处都是.正确的语法是
(let ((v1 e1)
(v2 e2)
(v3 e3))
e0)
Run Code Online (Sandbox Code Playgroud)
即所有绑定都在一个列表中,每个绑定都是两个元素的列表.请注意,变量绑定到的表达式(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))))))
Run Code Online (Sandbox Code Playgroud)
给予例如
(poly-eval '((1 1) (5 0)) '(5 1))
Run Code Online (Sandbox Code Playgroud)
导致
((5 2) (25 1))
Run Code Online (Sandbox Code Playgroud)