sicp 3 1 1小節習題嘗試解答

2021-09-23 16:43:53 字數 2184 閱讀 3607

這一節主要是介紹區域性狀態變數,介紹了set!和begin的語法,看來ruby使用!號來表示改變變數值不是什麼新鮮主意。

習題3.1,不解釋了

;習題3.1

(define (make-accumulator init)

(define (accumulator num)

(set! init (+ init num))

init)

accumulator)

習題3.2,非常有趣的例子,在內部維持乙個計數的變數即可,如果傳入的引數是特定的符號就返回計數或者清0,如果不是,原過程呼叫。

;習題3.2

(define (make-monitored proc)

(let ((counter 0))

(define (proc-monitor args)

(cond ((eq? args 'how-many-calls?) counter)

((eq? args 'reset-count) (begin (set! counter 0) counter))

(else

(begin (set! counter (+ counter 1)) (proc args)))))

proc-monitor))

請注意,我的實現只能針對有乙個引數的過程,對於多個引數的過程我還不知道怎麼做。

習題3.3,passwd的區域性狀態變數,在dispatch前比較下傳入的密碼是否與之一致

;習題3.3

(define (make-account balance 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)

(else

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

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

dispatch)

不一致的時候,返回乙個匿名過程,僅僅是輸出訊息incorrect password

習題3.4,在內部維持乙個區域性變數counter,用於計數密碼錯誤的次數,在dispatch前判斷counter是否等於7,如果是7就呼叫過程call-the-cops。

;習題3.4

(define (make-account balance passwd)

(let ((counter 0))

(define (withdraw amount)

(if (>= balance amount)

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

"餘額不足"))

(define (deposit amount)

(set! balance (+ balance amount))

balance)

(define (call-the-cops amount)

"您已經嘗試輸入密碼7次了!不能再試!")

(define (dispatch pwd m)

(cond ((= 7 counter) call-the-cops)

((eq? pwd passwd)

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

((eq? m 'deposit) deposit)

(else

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

(else

(begin (set! counter (+ counter 1)) (lambda(x) "incorrect password")))))

dispatch))

文章**莊周夢蝶  ,原文發布時間2007-07-24

sicp習題2 2節嘗試解答

習題2.17,直接利用list ref和length過程 define last pair items list list ref items length items 1 習題2.18,採用迭代法 define reverse list items define reverse iter i k ...

sicp 4 3 3小節習題

本節實現了amb求值器,題目都是擴充套件這個求值器,引入一些特殊的過程。我的嘗試解答從4.51開始 習題4.51,要求實現permanent set 這個過程的 在遇到失敗時不撤銷,實現如下 擴充analyze permanent assignment?exp analyze permanent a...

sicp 4 2 2小節部分習題

4.27,l eval input define count 0 l eval value ok l eval input define id x set count 1 count x l eval value ok l eval input define w id id 10 l eval va...