sicp 3.1.1小节习题尝试解答

这一节主要是介绍局部状态变量,介绍了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

时间: 2024-08-02 10:20:15

sicp 3.1.1小节习题尝试解答的相关文章

sicp 4.3.3小节习题

  本节实现了amb求值器,题目都是扩展这个求值器,引入一些特殊的过程.我的尝试解答从4.51开始 习题4.51,要求实现permanent-set!,这个过程的副作用在遇到失败时不撤销,实现如下: ;扩充analyze  ((permanent-assignment? exp)          (analyze-permanent-assignment exp)) ;实现 (define (permanent-assignment? exp)   (tagged-list? exp 'per

sicp 2.3小结习题尝试解答

 习题2.2没有全部做,我读书的速度远远超过做习题的进度,没办法,时间有限,晚上的时间基本用来看书了,习题也都是在工作间隙做的,慢慢来了,前两章读完再总结下.回到2.3节,这一节在前几节介绍数值型符号数据的基础上引入了符号数据,将任意符号作为数据的能力非常有趣,并给出了一个符号求导的例子,实在是太漂亮了. 习题2.53,直接看结果: > (list 'a 'b 'c)(a b c)> (list (list 'george))((george))> (cdr '((x1 x2) (y1 

sicp 5.1节习题尝试解答

5.1 图就不画在机器上了,麻烦 5.2 用寄存器语言描述5.1题中的阶乘机器,加上了读取和打印,这里的解答全部在实际的寄存机器中验证过,但是仍然按照该节的表示法表示. (controller   fac-loop    (assign n (op read))    (assign product (const 1))    (assign counter (const 1))   iter-loop    (test (op >) (reg counter) (reg n))    (bra

sicp 4.4.1小节习题

本节开始进入第4章最后一部分--逻辑程序设计.scheme将实现一种查询语言,非常类似prolog.由于解释器的实现在后面,还未读到,前面的习题我都将用prolog做测试,当然也给出scheme版本的解答,待以后测试.     首先给出依照书中所述写出的prolog事实库: address('BitDiddle Ben','Slumerville','Ridge Road',10). address('Hacker Alyssa P','Cambridge','Mass Ave',78). ad

sicp3.5.2、3.5.3节部分习题尝试解答

   本节主要讲述无穷流. 3.53,显然 (define s (cons-stream 1 (add-stream s s))) 定义是2的n次方组成的无穷数列,2,4,8,16,32... 3.54,定义阶乘组成的无穷序列: (define (mul-streams s1 s2)   (stream-map * s1 s2)) (define factorials (cons-stream 1 (mul-streams factorials (stream-cdr integers))))

sicp4.1.1-4.1.5节部分习题尝试解答(update)

    当将用scheme写的scheme求值器跑起来的时候,你不觉的兴奋是不可能的,真的太酷了,太magic了. 习题4.2,如果将application?判断放在define?判断之前,那么求值(define x 3)将把define当作一般的procedure应用于参数x和3,可是define是特殊的语法形式,而非一般过程,导致出错. 习题4.4,我的解答,eval增加两个判断:  ((and? exp)    (eval-and (and-exps exp) env))  ((or? e

sicp 2.4节小题尝试解答

这一节那是相当的有趣,抽象数据的多重表示:采用标志(tag)来区分和数据导向(data-directed)技术,稍微提了下消息传递.通过一张二维表格将类型.操作的分派机制介绍的很清楚,静态OO语言正是通过类型来决定消息的分派,而消息传递以列进行划分,每个类型都以过程来表征,也就是所谓的"智能数据对象",两者各有优缺点.当类型增加频繁时,消息传递风格的分派更容易扩展,当操作增加频繁时,反而是显式的类型分派更为容易扩展,这一点如果有OO设计经验应该很容易体会. 看看习题: 习题2.73,将

《网站设计 开发 维护 推广 从入门到精通》——2.5 经典习题与解答

2.5 经典习题与解答 1.填空题(1)自然界中色彩五颜六色.千变万化,但是最基本的只有三种(红.黄.蓝),其他的色彩都可以由这三种色彩调和而成,这三种色彩称为 . (2)现实生活中的色彩可以分为彩色和非彩色.其中黑白灰属于 系列,其他的色彩都属于 . 2.简答题简要说出网页色彩搭配的一些原理.

《网站设计 开发 维护 推广 从入门到精通》—— 2.5 经典习题与解答

2.5 经典习题与解答 1.填空题(1)自然界中色彩五颜六色.千变万化,但是最基本的只有三种(红.黄.蓝),其他的色彩都可以由这三种色彩调和而成,这三种色彩称为 . (2)现实生活中的色彩可以分为彩色和非彩色.其中黑白灰属于 系列,其他的色彩都属于 . 2.简答题简要说出网页色彩搭配的一些原理.