scheme - 表达式简化

标签 scheme

我有这段代码来计算导数:

(define (diff x expr)
  (if  (not (list? expr))
    (if  (equal? x expr) 1 0)
    (let ((u (cadr expr)) (v (caddr expr)))
     (case (car expr)
       ((+) (list '+ (diff x u) (diff x v)))
       ((-) (list '- (diff x u) (diff x v)))
       ((*) (list '+
                   (list  '* u (diff x v))
                   (list  '* v (diff x u))))
        ((/) (list ‘div (list '-
                  (list  '* v (diff x u))
                  (list  '* u (diff x v)))
                  (list  '* u v)))
))))

如何简化代数表达式?

代替 x + x 显示 2x

代替 x * x 显示 x^2

最佳答案

代数表达式的简化非常困难,尤其是与导数的计算相比。应该递归地进行简化。您首先简化最内层的表达式。一次不要尝试太多。我将从最基本的简化开始,例如:

 0 + x -> x
 0 * x -> 0
 1 * x -> x
 x ^ 0 -> 1
 x ^ 1 -> x

用加法代替减法,用乘法代替除法

 x - y -> x + (-1)*x
 x / y -> x ^ (-1)

这可能看起来不像是一种简化,但它会简化您的代码。您始终可以在最后撤消此步骤。

然后使用结合律和交换律对术语进行排序。将数值移到左侧,按一些预定义的顺序对变量进行排序(不必按字母顺序排列,但应该始终相同)

 (x * y) * z -> x * (y * z)
 x * 2 -> 2 * x
 2 * (x * 3) -> 2 * (3 * x)

化简指数

  (x ^ y) ^ z -> x^(y * z)

简化数字部分。

 2 * (3 * x) -> 6 * x
 2 + (3 + x) -> 5 + x

完成此操作后,您可以考虑收集常用表达式。

关于scheme - 表达式简化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/885901/

相关文章:

while-loop - 使用 "define-syntax-rule"制作我自己的 while 循环

list - 如何迭代列表中的每个元素而不删除方案中的元素

scheme - 如何检查我的列表以查看它是否仅包含一个值或多个值?

scheme - 是否有内置的 Racket 将元素作为列表重复 n 次?

emacs - 为什么 Emac 的 scheme-mode 多了一个换行符?

lisp - SICP、方案、DrRacket 问题 : Timer/profiler function?

scheme - 这个scheme/script-fu/gimp代码有什么错误?

scheme - 为什么 + 和 * 分别计算为 0 和 1?

clojure - 学习一种 Lisp 有助于学习另一种吗?

filter - 在方案 (SCM) 中的 Define Filter 函数的结果末尾获取 #f 或 False