首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >LISP中的表达式简化和求值

LISP中的表达式简化和求值
EN

Stack Overflow用户
提问于 2015-10-29 02:42:12
回答 1查看 523关注 0票数 0

我试图创建一个lisp函数来评估和简化乘法和加法算法。该函数的工作方式应该是,当用户调用一个函数(simplify‘(*1.2))时,它只打印2,或者(simplify '(*0,3,7))只打印0。

到目前为止我有这个

代码语言:javascript
复制
(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
                            )
                        )
                    )
                )

            )
        )
    )
)
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-10-29 07:24:08

您可以编写一个函数简化,它适用于乘法和加法的简化规则。如果要递归地简化表达式,首先必须简化每个参数,然后为相应的操作应用简化规则。以下是一个起点:

代码语言:javascript
复制
(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)等。以及检测错误表达式(简化'(+))。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33405065

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档