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

目录
相关文章
|
6月前
|
C语言
C程序设计内容与例题讲解 -- 第四章--选择结构程序设计(第五版)谭浩强
C程序设计内容与例题讲解 -- 第四章--选择结构程序设计(第五版)谭浩强
117 1
|
6月前
|
存储 C语言
C程序设计内容与例题讲解 -- 第三章第二部分(第五版)谭浩强
C程序设计内容与例题讲解 -- 第三章第二部分(第五版)谭浩强
|
6月前
|
C语言 数据格式
C程序设计内容与例题讲解 -- 第三章第三部分(第五版)谭浩强
C程序设计内容与例题讲解 -- 第三章第三部分(第五版)谭浩强
|
6月前
|
存储 移动开发 C语言
# C程序设计内容与例题讲解 -- 第三章第一部分(第五版)谭浩强
# C程序设计内容与例题讲解 -- 第三章第一部分(第五版)谭浩强
|
5月前
|
IDE 编译器 开发工具
详细解读C语言程序设计:现代方法(第2版)第二章全部习题答案
详细解读C语言程序设计:现代方法(第2版)第二章全部习题答案
42 0
|
6月前
|
C语言
C程序设计内容与例题讲解 -- 第四章--选择结构程序设计第二部分(第五版)谭浩强
C程序设计内容与例题讲解 -- 第四章--选择结构程序设计第二部分(第五版)谭浩强
|
机器学习/深度学习 存储 人工智能
C语言程序设计第五版谭浩强课后答案 第五章习题答案(3-17题)
C语言程序设计第五版谭浩强课后答案 第五章习题答案(3-17题)
|
存储 编译器 程序员
第八章 数组《C语言程序设计现代方法(第2版)》读书笔记
我们所见的变量都只是 标量(scalar ):标量具有保存单一数据项的能力。C语言也支持 聚合 (aggregate )变量,这类变量可以存储一组一组的数值。在 C 语言中一共有两种聚合类型: 数组 (array)和结构(structure )。
第八章 数组《C语言程序设计现代方法(第2版)》读书笔记
|
Java
java编程思想第四版第十一章习题
运行结果分析: 这个案例的重点是, 数组瘦受限制的, 集合是没有元素个数限制的。
212 0