Scheme 简化求导表达式格式
我正在使用Scheme语言对输入的表达式进行求导,在大多数情况下,我相信我的表驱动函数工作得足够好,但现在我想创建一些表达式来简化输出Scheme 简化求导表达式格式,scheme,Scheme,我正在使用Scheme语言对输入的表达式进行求导,在大多数情况下,我相信我的表驱动函数工作得足够好,但现在我想创建一些表达式来简化输出 例如: (d'(*(+x1)(+x-1)))->'(*2x)而不是->'(+(*(+x1)(+10))(*(+10)(+x-1))) 我对Scheme比较陌生,所以我知道这只是一个能够递归解析列表的问题,但我不知道从哪里开始,知道如何实现吗 这是我的函数代码 (define lookup (lambda (x alist) (cadr (assoc x alis
例如:
(d'(*(+x1)(+x-1)))->'(*2x)而不是->'(+(*(+x1)(+10))(*(+10)(+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))))))
简化表达式与计算导数完全无关。它基本上是一个模式匹配和替换过程,例如,
(+anything 0)
简化为anything
。我想将导数的输出简化为上面所说的,而不是得到“(+(*(+x1)(+10))(*(+10))(+x-1)))从(*(+x-1)(+x-1)))的导数开始,我尝试将其简化为(*2 x)作为Scheme的新手,我不确定如何轻松解析列表以简化它,因为一般简化可能是一项相当困难的任务,我理解您的要求。就像我说的,这是一个完全独立的手术<代码>(定义simplify…然后执行(simplify(d'(…)
您也可以从d
自动调用它:(simplify(应用(查找op d-op-table)参数))
简化表达式完全独立于导数的计算,与导数的计算无关。它基本上是一个模式匹配和替换过程,例如,(+anything 0)
简化为anything
。我想将导数的输出简化为上面所说的,而不是得到“(*(+x1)(+10))(*(+10))(+x-1)))从(*(+x-1)(+x-1)))的导数开始,我尝试将其简化为(*2 x)作为Scheme的新手,我不确定如何轻松解析列表以简化它,因为一般简化可能是一项相当困难的任务,我理解您的要求。就像我说的,这是一个完全独立的手术(定义simplify…
然后执行(simplify(d'(…)
您也可以从d
自动调用它:(simplify(应用(查找op d-op-table)参数))