按照题目的练习,以书本 100 页的 deriv
函数为基础,加上相应的 case 和函数:
;;; 56-deriv.scm
(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))))
((exponentiation? exp) ; 新增
(let ((n (exponent exp)) ;
(u (base exp))) ;
(make-product ;
n ;
(make-product ;
(make-exponentiation ;
u ;
(- n 1)) ;
(deriv u var))))) ;
(else
(error "unknown expression type -- DERIV" exp))))
;; exponentiation
(define (make-exponentiation base exponent) ; 新增
(cond ((= exponent 0) ;
1) ;
((= exponent 1) ;
base) ;
(else ;
(list '** base exponent)))) ;
;
(define (exponentiation? x) ;
(and (pair? x) ;
(eq? (car x) '**))) ;
;
(define (base exp) ;
(cadr exp)) ;
;
(define (exponent exp) ;
(caddr exp)) ;
;; number
(define (=number? exp num)
(and (number? exp)
(= exp num)))
;; variable
(define (variable? x)
(symbol? x))
(define (same-variable? v1 v2)
(and (variable? v1)
(variable? v2)
(eq? v1 v2)))
;; sum
(define (make-sum a1 a2)
(cond ((=number? a1 0)
a2)
((=number? a2 0)
a1)
((and (number? a1) (number? a2))
(+ a1 a2))
(else
(list '+ a1 a2))))
(define (sum? x)
(and (pair? x)
(eq? (car x) '+)))
(define (addend s)
(cadr s))
(define (augend s)
(caddr s))
;; product
(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))
(else
(list '* m1 m2))))
(define (product? x)
(and (pair? x)
(eq? (car x) '*)))
(define (multiplier p)
(cadr p))
(define (multiplicand p)
(caddr p))
测试:
1 ]=> (load "56-deriv.scm")
;Loading "56-deriv.scm"... done
;Value: multiplicand
1 ]=> (deriv '(** x 0) 'x)
;Value: 0
1 ]=> (deriv '(** x 1) 'x)
;Value: 0
1 ]=> (deriv '(** x 2) 'x)
;Value 11: (* 2 x)
1 ]=> (deriv '(** x 3) 'x)
;Value 12: (* 3 (** x 2))