【发布时间】:2019-10-14 20:53:39
【问题描述】:
d 函数应以简化形式返回输入表达式的导数。我知道有一个派生方案功能,但我使用列表来挑战自己。我是语言新手。我已经编写了测试用例来测试我的解决方案,但预期的输出是错误的并且没有简化。
(define d
(λ (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 '+ (λ (u v)(list '+ (d u) (d v))))
(list '- (λ (u v)(list '- (d u) (d v))))
(list '* (λ (u v)(list '+ (list '* u (d v))(list '* v (d u)))))))
(list 'sin (λ (u)(list '*( list 'cos (d u)))))
(list 'cos (λ (u)(list '*( list '-sin (d u)))))
(list 'log (λ (u)(list '* (list '/1 u) (d u))))
(list 'exp (λ (u)(list '* (d u)(list 'exp u))))
(list 'expt (λ (u v) (list 'expt (list '* v u) (- v 1))))
(define lookup
(λ (op
table)
(if (equal? op (caar table))
(cadar table)
(lookup op (cdr table)))))
;; Test cases
;; (d '(* (+ x 4) (+ x -7)))
;; '(+ (* (+ x 4) (+ 1 0)) (* (+ x -7) (+ 1 0)))
;; (d '(* x (* x (* x (* x x)))))
;; '(+ (* x (+ (* x (+ (* x (+ (* x 1) (* x 1))) (* (* x x) 1))) (* (* x (* x x)) 1))) (* (* x (* x (* x x))) 1))
例子:
通过输入函数
(d '(* (+ x 1) (+ x -1)))
我期待
(+ (* (+ x 1) (+ 1 0)) (* (+ 1 0) (+ x -1)))
但我明白了
(+ (* (+ x 1) (+ 1 0)) (* (+ x -1) (+ 1 0)))
【问题讨论】:
-
你有衍生代码,但没有简化代码。
-
你能展示你得到的和你期望的吗?
-
通过输入函数 (d '(* (+ x 1) (+ x -1))) 我期望 (+ (* (+ x 1) (+ 1 0)) (* ( + 1 0) (+ x -1))) 但我得到 '(+ (* (+ x 1) (+ 1 0)) (* (+ x -1) (+ 1 0)))
-
把细节放在问题里。
-
d-op-table的*行上有两个额外的)。他们应该在expt行。
标签: scheme racket derivative