首页 > 解决方案 > 简化派生表达式方案

问题描述

我正在使用 Scheme 语言对输入表达式进行导数,并且在大多数情况下,我相信我的表驱动函数运行良好,但现在我想创建一些表达式来处理简化输出。
例如:
(d '(* (+ x 1) (+ x -1))) -> '(* 2 x) 而不是 -> '(+ (* (+ x 1) (+ 1 0)) ( * (+ 1 0) (+ x -1)))
我对Scheme比较陌生,所以我知道这只是能够递归解析列表的问题,但我不确定从哪里开始,不知道如何实现这个?

这是我的函数代码

(define lookup (lambda (x alist) (cadr (assoc x alist))))


;-----------------------------------------------------

(define d
  (lambda (e)
    (cond ((number? e) 0)
      ((equal? e 'x) 1)
      (else
       (let ((op (car e)) (args (cdr e)))
         (apply (lookup op d-op-table) args))))))


(define d-op-table
  (list(list '+   (lambda (u v)(list '+ (d u) (d v))))
       (list '-   (lambda (u v)(list '- (d u) (d v))))
       (list '*   (lambda (u v)(list '+ (list '* u (d v))(list '* (d u) v))))
       (list 'sin (lambda (u)(list '*( list 'cos (d u)))))
       (list 'cos (lambda (u)(list '*( list '-sin (d u)))))
       (list 'log (lambda (u)(list '* (list '/ 1 u) (d u))))
       (list 'exp (lambda (u)(list '* (d u)(list 'exp u))))
       (list 'expt (lambda (u v) (list 'expt (list '* v  u) (- v 1))))))

标签: scheme

解决方案


推荐阅读