-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy path2.57.rkt
61 lines (58 loc) · 1.93 KB
/
2.57.rkt
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
#lang racket
(define(deriv exp var)
(cond((number? exp)0)
((variable? exp)
(if(same-variable? exp var) 1 0))
((sum? exp)
(make-sum(deriv(addend exp) var)
(deriv(augend exp) var)))
((product? exp)
(make-sum
(make-product(multiplier exp)
(deriv(multiplicand exp) var))
(make-product(deriv(multiplier exp)var)
(multiplicand exp))))
((exponentitation? exp)
(make-product
(make-product(exponent exp)
(make-exponentitation (base exp)(-(exponent exp)1)))
(deriv (base exp) var)))
(else
(error"unkown expression type -- DERIV" exp))))
(define(variable? x)(symbol? x))
(define(same-variable? v1 v2)
(and(variable? v1)(variable? v2)(eq? v1 v2)))
(define (make-sum a1 a2)
(cond((=number? a1 0) a2)
((=number? a2 0) a1)
((and(number? a1)(number? a2))(+ a1 a2))
((sum? a2)(cons '+(cons a1 (cdr a2))))
(else(list '+ a1 a2))))
(define(=number? exp num)
(and(number? exp)(= exp num)))
(define(make-product m1 m2)
(cond((or(=number? m1 0)(=number? m2 0))0)
((=number? m1 1)m2)
((=number? m2 1)m1)
((and(number? m1)(number? m2))(* m1 m2))
((product? m2)(cons '* (cons m1 (cdr m2))))
(else(list '* m1 m2))))
(define (sum? x)
(and (pair? x)(eq? (car x) '+)))
(define(addend s)(cadr s))
(define(augend s)(if(null? (cdddr s))(caddr s)(cons '+ (cddr s))))
(define(product? x)
(and(pair? x)(eq?(car x) '*)))
(define (multiplier p)(cadr p))
(define(multiplicand p)(if(null? (cdddr p))(caddr p)(cons '* (cddr p))))
;;求幂导数
(define(exponentitation? x)
(and(pair? x)(eq? (car x) '**)))
(define(base x)
(cadr x))
(define(exponent x)
(caddr x))
(define(make-exponentitation b e)
(cond((=number? e 0)1)
((=number? e 1)b)
(else(list '** b e))))