我试图创建一个lisp函数来评估和简化乘法和加法算法。该函数的工作方式应该是,当用户调用一个函数(simplify‘(*1.2))时,它只打印2,或者(simplify '(*0,3,7))只打印0。
到目前为止我有这个
(defun simplify-multiplication (lis)
(if (not (null lis))
(if (member '0 lis) 0
(if (member '1 lis) cdr lis
(if (listp (car lis))
(cons(simplify(car lis)))
(if (numberp (car lis))
(if (null (cdr lis))
lis
(cons (car lis) (simplify-multiplication (cdr lis)))
)
(if (eq (car lis) '+)
(cons (car lis) (simplify-multiplication (cdr lis)))
(if (eq (car lis) '*)
(cons (car lis) (simplify-multiplication (cdr lis)))
lis
)
)
)
)
)
)
)
)发布于 2015-10-29 07:24:08
您可以编写一个函数简化,它适用于乘法和加法的简化规则。如果要递归地简化表达式,首先必须简化每个参数,然后为相应的操作应用简化规则。以下是一个起点:
(defun simplify (lis)
(if (atom lis)
lis
(let ((args (mapcar #'simplify (cdr lis))))
(cond
((eql (car lis) '+)
(setq args (remove 0 args))
(case (length args)
(0 0)
(1 (car args))
(otherwise (cons '+ args)) ))
((eql (car lis) '*)
(if (member 0 args)
0
(progn
(setq args (remove 1 args))
(case (length args)
(0 1)
(1 (car args))
(otherwise (cons '* args)) ))))
(T (cons (car lis) args)) ))))您可能希望添加其他简化规则,如(* 2 (* 34)) => (* 2 34)等。以及检测错误表达式(简化'(+))。
https://stackoverflow.com/questions/33405065
复制相似问题