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
java编程思想第四版第三章要点习题 输出结果: 这个结果需要特别说明一下, String是特殊的引用类型, 当他被直接赋值时,就是把这个值对应的引用位置赋值给String变量了, 所以, 两次结果都是true。 如果你用new String()赋值, 结果就不同了.
java编程思想第四版第八章习题 第一题 package net.mindview.polymorphism; //基类-自行车 class Cycle{ } //子类-单轮车 class Unicycle extends Cycle{ } //子类-双轮车 class Bicycle extends Cycle{ } //子类-三轮车 class Tricycle extends Cycl...
相关文章
- C语言/C++常见习题问答集锦(七十一) 之创建链表与洗牌发牌
- C语言/C++常见习题问答集锦(四十) 之分门别类
- C语言/C++常见习题问答集锦(十八)烟花程序为什么不能放烟花(亲测解决,与大家分享)
- 【习题 8-20 UVA-1620】Lazy Susan
- 【习题 8-15 UVA - 1617】Laptop
- 【习题 3-10 UVA - 1587】Box
- 习题 3.23 用迭代法求x=根号a。求平方根的迭代公式为···,要求前后两次求出的x的差的绝对值小于10的-5次。
- 习题 3.2 设圆半径r=1.5, 圆柱高h=3, 求圆周长、圆面积、圆球表面积、圆球体积、圆柱体积。用cin输入数据,输出计算结果,输出时要求有文字说明,取小数点后两位数字。请编程序。
- 习题 7.1 定义一个结构体变量(包括年、月、日),编写程序,要求输入年、月、日,程序能计算并输出该日在本年中是第几天。注意闰年问题。
- 习题 7.4 在上题的基础上,编写一个函数input,用来输入5个学生的数据。
- 习题 3.1 假如我国国民生产总值的年增长率为9%,计算10年后我国国民生产总值与现在相比增长多少百分比。
- 高等数学(第七版)同济大学 习题4-5 个人解答
- 高等数学(第七版)同济大学 习题7-2 个人解答
- 高等数学(第七版)同济大学 习题9-10 个人解答
- 计算机网络课后作业习题2
- Java刷题面试系列习题(十三)