scheme - 简化派生表达式方案
问题描述
我正在使用 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))))))
解决方案
推荐阅读
- java - jar包中的类未在类路径中设置
- apache - Apache .htaccess REQUEST_FILENAME 不限于 257 个字符
- c# - 对 PDF 的 Web Api 内容响应
- java - 无法获取用于配置数据库 Tomcat 的 .properties 文件
- android - 更新 Android Studio 后的代理问题
- android - 如何在 Android Room SQL 中使用对象属性?
- typescript - 使用模板 Vuetify 表单
- javascript - 从多个子组件更新父组件状态而不考虑更新的状态值
- c# - 使用来自 dll 的参数获取 nunit (2.5.10) TestCases
- python - Python 2 根据阈值删除最旧的目录