sicp 習題3 6 3 8試解

2021-08-29 08:50:46 字數 2087 閱讀 2662

習題3.6,我的實現如下:

(define rand

(let ((x 3))

(lambda(arg)

(cond((eq? arg 'generate)

((lambda()(set! x (rand-update x)) x)))

((eq? arg 'reset)

(lambda(init) (set! x init) (set! x (rand-update x)) x))

(else

error "unkonown op")))))

簡單解釋下,當引數是generate時,直接呼叫匿名lambda函式(lambda()(set! x (rand-update x)) x) ,最後返回隨機值。而當第乙個引數是reset時,返回匿名函式(lambda(init) (set! x init) (set! x (rand-update x)) x),這個匿名函式接受乙個新的初始值,並賦值給x,然後呼叫rand-update

習 題3.7,引入賦值的代價就是引入了***以及相應的複雜性,3.3小節提出了命令式語言與函式式語言的基本差別。這一題,首先修改習題3.3(參見 《sicp 3.1小結習題嘗試解答》),增加乙個檢查密碼是否正確的功能,用以檢查輸入的原始帳戶密碼是否正確,make-account修改一下

;習題3.3

(define (make-account2 balance passwd)

(define (checkpwd pwd)

(eq? pwd passwd))

(define (withdraw amount)

(if (>= balance amount)

(begin (set! balance (- balance amount)) balance)

"餘額不足"))

(define (deposit amount)

(set! balance (+ balance amount))

balance)

(define (dispatch pwd m)

(if (eq? pwd passwd)

(cond ((eq? m 'withdraw) withdraw)

((eq? m 'deposit) deposit)

((eq? m 'checkpwd) checkpwd)

(else

(error "unknow request--make-account" m)))

(lambda(x) "incorrect password")))

dispatch)

那麼,make-joint可以寫為:

(define (make-joint account-name account-pass new-pass)

(if (account-name 'checkpwd account-pass)

(lambda (passwd m)

(if (eq? new-pass passwd)

(account-name account-pass m)

(error "incorrect password")))

(error

"incorrect password to the original account")))

首先是檢查原始帳戶的密碼是否正確,正確返回匿名函式(兩個引數passwd m),此匿名函式檢查密碼以及呼叫原始帳戶操作;如果不正確就提示訊息。

測試一下:

> (define dennis-acc (make-account2 100 '123))

> (define zane-acc (make-joint dennis-acc '123 'abc))

> ((dennis-acc '123 'withdraw) 10)

90>  ((zane-acc 'abc 'withdraw) 10)

80> 

習題3.8,這一題比較簡單了,在內部維持乙個狀態變數即可

(define f

(let ((y 1))

(lambda(x) (set! y (* x y)) y)))

測試可知,在(f 1) (f 0)執行的順序不同時,返回的值不同。

SICP習題1 6的解答

sicp就是名著 structure and interpretation of computer programs 著名的巫師書 wizard book 和紫書 purple book 雖說英文原版可以從網上合法 中文版翻譯也還不錯。閒話少敘,下面我們研究一下書中 1.1.7節的練習題1.6。原題...

SICP習題解答1 1 1 8

lang racket exercise 1.1 10 5 3 4 9 1 6 2 2 4 4 6 define a 3 define b a 1 a b a b a b if and b a b a b ba cond a 4 6 b 4 6 7 a else 25 2 if b a b a co...

SICP習題解答2 7 2 16

lang racket exercise 2.7 define make interval a b cons a b define upper bound interval max car interval cdr interval define lower bound interval min c...