SICP學習筆記 2 3 2 例項 符號求導

2021-09-01 14:21:42 字數 3027 閱讀 5559

練習2.56

(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)

(make-product

(make-product (exponent exp)

(make-exponentiation (base exp) (- (exponent exp) 1)))

(deriv (base exp) var)))

(else (error "unknown expression type -- deriv" exp))))

練習2.57

;; 加法

(define (make-sum-list x list)

(if (null? list)

x(make-sum x

(make-sum-list (car list) (cdr list)))))

(define (make-sum-all x . y)

(make-sum-list x y))

;; 被加數

(define (augend-list s)

(let ((l (length s)))

(cond ((= l 1) 0)

((= l 2) (cadr s))

((= l 3) (augend s))

(else (cons '+ (cddr s))))))

;; 乘法

(define (make-product-list x list)

(if (null? list)

x(make-product x

(make-product-list (car list) (cdr list)))))

(define (make-product-all x . y)

(make-product-list x y))

;; 被乘數

(define (multiplicand-list p)

(let ((l (length p)))

(cond ((= l 1) 1)

((= l 2) (cadr p))

((= l 3) (multiplicand p))

(else (cons '* (cddr p))))))

;; 使用新的加法和乘法構造求導過程

(define (deriv exp var)

(cond ((number? exp) 0)

((variable? exp)

(if (same-variable? exp var) 1 0))

((sum? exp)

(make-sum-all (deriv (addend exp) var)

(deriv (augend-list exp) var)))

((product? exp)

(make-sum-all

(make-product-all (multiplier exp)

(deriv (multiplicand-list exp) var))

(make-product-all (deriv (multiplier exp) var)

(multiplicand-list exp))))

((exponentiation? exp)

(make-product-all

(make-product-all (exponent exp)

(make-exponentiation (base exp) (- (exponent exp) 1)))

(deriv (base exp) var)))

(else (error "unknown expression type -- deriv" exp))))

1 ]=> (deriv '(* x y (+ x 3)) 'x)

;value : (+ (* x y) (* y (+ x 3)))

練習2.58

;; 修改加法的建構函式、選擇函式和謂詞

(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))))

(else (list a1 '+ a2))))

(define (addend s) (car s))

(define (augend s) (caddr s))

(define (sum? x)

(and (pair? x) (eq? (cadr x) '+))

;; 使用類似的方法修改乘法的建構函式、選擇函式和謂詞

1 ]=> (deriv '((x * y) * ( x + 3)) 'x)

;value : ((x * y) + (y * (x + 3)))

1 ]=> (deriv '(x + (3 * (x + (y + 2)))) 'x)

;value: 4

練習2.59

;; 暫無

SICP學習筆記(1 1 4 1 1 5)

sicp學習筆記 1.1.4 1.1.5 周銀輝 書接上一回,這裡是我在學習1.1.4 1.1.5時的一些筆記 1,標準過程與復合過程 以 scheme為例,作為一門語言,其內建了一些原始過程 或稱之為標準的過程 與scheme環境中,比如,實際上與某個內建過程關聯 繫結 了起來,該過程接收兩個引數...

SICP學習筆記(1 1 1 1 1 3)

sicp學習筆記 1.1.1 1.1.3 周銀輝 sicp,即structure and interpretation of computer programs,電腦程式的構造和解釋,是mit 麻省理工學院 一門經典課程,相信很多程式愛好者都讀過,最近我也抽空讀了讀,挺有意思的。算是對大學知識 高數...

SICP學習筆記(一)

一直在斷斷續續地看sicp,確實字字珠璣,今天總算看了前兩章,習題做了一部分,不過日後肯定還是要回頭重看的,現在略微回頭總結一下。1 好的程式語言應提供的三種機制 基本表示式 組合 抽象 實際上我們自己也可以為特定問題制定自己的 語言 是否具有上述能力是這個語言是否強大的關鍵 2 過程作為黑箱的抽象...