gpt4 book ai didi

scheme - 在 Racket 中使用调度表

转载 作者:行者123 更新时间:2023-12-03 18:18:30 25 4
gpt4 key购买 nike

我正在编写一个小程序来计算以列表形式表示的表达式的简单导数,即 2x^2 表示为 (* 2 (exp x 2)) 和我定义了以下函数:

;; derivative of a constant is 0
(define (diff-constant x E) 0)

;; computes derivative of E with respect to x where E can only be of the form
;; (+ x x ...)
(define (diff-sum x E)
(cond ((or (not (list? E)) (null? E)) 0)
((eq? (car E) x) (+ 1 (diff-sum x (cdr E))))
(else (diff-sum x (cdr E)))))

;; computes derivative of E with respect to x where E can only be of the form
;; (* x y)
(define (diff-product x E)
(cond ((and (eq? x (cadr E)) (eq? x (caddr E))) (list '* 2 x))
((eq? x (cadr E)) (list (caddr E)))
((eq? x (caddr E)) (list (cadr E)))
(else 0)))

;; computes derivative of E with respect to x where E can only be of the form
;; (expt x y) which is x^y
(define (diff-expt x E)
(cond ( not (eq? x (cadr E)) 0)
((eq? 1 (caddr E)) 0)
((eq? 2 (caddr E)) (cadr E))
(else (list '* (caddr E) (list 'expt x (- (caddr E) 1))))))

我还有一个调度表定义为:

;; Dispatch Table of supported operators.
(define diff-dispatch
(list (list '+ diff-sum)
(list '* diff-product)
(list 'expt diff-expt)
))

我正在尝试编写一个函数diff,它采用方程式E(以列表形式)并计算关于x 的导数> 并使用调度表调用预定义函数返回结果

这是我目前所知道的,但我想不出其余的

;; Differentiate expression E with respect to x.
(define (diff x E)
(cond ((number? E) (diff-constant x E))
;; insert code here to handle the other base case - variables
...
(else ; insert code here to lookup the appropriate function in the
; dispatch table based on the operator in the expression,
; then call that function to differentiate the expression
(diff-func x E))))))

ex: (diff 'x '(+ x (* x x))) 应该计算为 (+ 1 (+ (* 1 (* x)) (* x 1) ))(即 1 + x + x)

最佳答案

SICP book有一整节详细解释了如何构建用于执行符号微分的 Scheme 程序,请查看 section §2.3 .特别要注意,您遗漏了一种情况——如果要派生的表达式是一个变量,会发生什么情况?检查链接以确保您在正确的轨道上。

现在,回答这个问题:根据代码中使用的表表示,实现调度程序很简单。这些方面的一些东西将有助于获得应用正确的微分程序:

((cadr             ; obtain the differentiation procedure
(assoc ; look for the differentiation procedure
(car E) ; obtain the operator in the expression
diff-dispatch)) ; dispatch table
x E) ; apply the procedure with parameters `x` and `E`

请注意,找到要应用的正确过程的“诀窍”在于表是作为关联列表实现的,而 assoc 过程正是为在这样的列表中查找数据而设计的列表。在 documentation 中阅读更多相关信息.

关于scheme - 在 Racket 中使用调度表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12944668/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com