【发布时间】:2012-12-01 01:08:44
【问题描述】:
我正在编写一个简化多项式的程序,现在只做加法和乘法。
我已经用头敲击键盘几个小时了,我想是时候寻求帮助了。
(defun simplify (lis)
(if (eq (car lis) '+)
(cons '+ (simplify-addition (cdr lis)))
(if (eq (car lis) '*)
(cons '* (simplify-multiplication (cdr lis)))
)
)
)
(defun simplify-addition (lis)
(if (not (null lis))
(if (listp (car lis))
(list (simplify (car lis)) (simplify-addition (cdr lis)))
(if (numberp (car lis))
(if (eq (car lis) 0)
(simplify-addition (cdr lis))
(if (null (cdr lis))
lis
(cons (car lis) (simplify-addition (cdr lis)))
)
)
(if (eq (car lis) '+)
(list (car lis) (simplify-addition (cdr lis)))
(if (eq (car lis) '*)
(list (car lis) (simplify-addition (cdr lis)))
lis
)
)
)
)
)
)
(defun simplify-multiplication (lis)
(if (not (null lis))
(if (listp (car lis))
(if (find 0 (car lis))
0
(list (simplify (car lis)) (simplify-multiplication (cdr lis)))
)
(if (numberp (car lis))
(if (null (cdr lis))
lis
(cons (car lis) (simplify-multiplication (cdr lis)))
)
(if (eq (car lis) '+)
(list (car lis) (simplify-multiplication (cdr lis)))
(if (eq (car lis) '*)
(list (car lis) (simplify-multiplication (cdr lis)))
lis
)
)
)
)
)
)
这是应该发生的:
(simplify ‘(+ x ( + 0 3 ) ( * 1 5 ) ( * ( * x y z ) 0 ) )) --> ( + x 3 5 )
(simplify ‘(* (+ 6 0) (* 1 6 2))) --------------------------------> (* 6 (* 6 2))
但是我要么得到与我发送的相同的多项式,要么完全关闭
编辑: 我需要的简化是从添加中删除 0,以便:
(+ 3 0) --> 3
(+ 4 0 6) --> (+ 4 6)
与零的乘法被删除
(* 6 0 7) --> 0
【问题讨论】:
-
+1 表示您的缩进样式,-1 表示不说明您会得到什么结果
-
所以你应该只简化一个级别?我问是因为在您的第二个示例中,结果可以简化为 72,但您只能走到 (* 6 (* 6 2))
-
我更新了这个问题,更具体地说明了函数应该做什么。
标签: lisp polynomial-math