sicp 习题3.6-3.8试解

习题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)执行的顺序不同时,返回的值不同.

文章转自庄周梦蝶  ,原文发布时间 2007-08-01

时间: 2024-12-22 21:54:35

sicp 习题3.6-3.8试解的相关文章

专家试解中国问题:代工每部iPhone仅获6.5美元

中新社北京6月19日电 (记者 邢利宇)高科技成果不能成功实现产业化,就如"只顾生孩子,不顾养孩子,其结果是孩子不能成为社会有用之材."对于中国鼓励高科技产业发展,日本新华侨华人会副会长曹德弼如此提醒. 中国政协十一届常委会第十八次会议正在此间召开.根据经济发展相关议题,全国政协港澳台侨委员会联系海外华侨华人和相关专家学者,日前征集建议性文章28篇,"试解"中国经济发展遇到的"难题".这些文章提交全国政协此次常委会议参阅. 目前中国经济规模已达世

sicp习题2.33-2.39尝试解答

这一节的内容非常有趣,通过将序列作为interface,在此基础上进而提取出各种高阶操作(map,filter,accumulate,enumerate等),由此引出模块化设计的讨论.模块化设计带来复杂性的降低,同时可能引入性能上的损失,比如书中对sum-odd-squares过程的两种写法,原来的写法枚举列表元素的过程散落在累积.过滤.映射的过程中,主要一次循环就够了,而通过三个高阶过程来操作反而需要3次的遍历. 习题2.33,将map,append,length基本过程用累积操作重新定义,联

中国视频网站试解赢利死结

在YouTube以16.5亿美金卖了个好价钱(与Google换股)的同时,国内的视频播客网站还在苦苦寻觅盈利模式. 10月18日,国内P2P流媒体网络直播视频平台上海聚力传媒技术有限公司(以下简称PPLive)与新好耶信息技术(上海)有限公司(下称好耶).上海江畔广告有限公司(下称江畔传媒)达成战略合作,在同业中开始系统性地尝试广告业务. "盗版"死结 根据相关协议,好耶将成为PPLive的广告技术提供方和广告客户代理商,而江畔传媒成为PPLive在网络游戏行业的广告独家代理.其间获得

Google试解网媒与传媒之结

中介交易 http://www.aliyun.com/zixun/aggregation/6858.html">SEO诊断 淘宝客 云主机 技术大厅

《新编计算机科学概论》一本章习题

本章习题 一.复习题 1. 试述数制的概念. 2. 列举出你所知道的数字系统. 3. 谈谈二进制.八进制和十六进制等数字表示方法各有什么优点和缺点. 4. 为什么使用二进制计算的时候会出现溢出? 5. 反码和补码相对于原码有什么优点?计算机中的数是用原码表示还是用反码.补码表示? 6. 汉字编码有哪几种?各自的特点是什么? 7. 图像是如何压缩存储的?哪一种图像占用空间最小,为什么? 8. ASCII码是什么编码?为什么国际上推行Unicode码? 9. 列举出你所知道的汉字输入码. 10. 尝

<font color="red">[置顶]</font>

Profile Introduction to Blog 您能看到这篇博客导读是我的荣幸,本博客会持续更新,感谢您的支持,欢迎您的关注与留言.博客有多个专栏,分别是关于 Windows App开发 . UWP(通用Windows平台)开发 . SICP习题解 和 Scheme语言学习 . 算法解析 与 LeetCode等题解 . Android应用开发 ,而最近会添加的文章将主要是算法和Android,不过其它内容也会继续完善. About the Author 独立 Windows App 和

c-编写一个程序,要求如下:

问题描述 编写一个程序,要求如下: 从标准输入读取一个字符串,存入一个动态分配的字符数组中.如何处理变长输入.(C++)是书上动态内存这一章的习题,所以指定用数组解. 解决方案 A) A.1)先分配一个指定长度(假定是n). A.2)逐个字节读, A.3)读到指定长度到了之后,重新分配一个n+10:把已读的赋值过来,继续读. A.4)重复A.2),直到读完 B) B.1)先分配一个指定长度(假定是n)+一个指向字符的指针. B.2)逐个字节读 B.3)读到指定长度到了之后,再分配一个n+一个指向

双十一,一群金融大脑去了趟苏州!

本文讲的是双十一,一群金融大脑去了趟苏州!随着移动互联网技术.云计算大数据.区块链技术的快速发展金融业用户也面临一场从传统IT基础架构到新技术架构的转型过程金融业数字化转型的过程也备受业界瞩目因为金融业一直处于整个中国行业发展的前列成为行业信息化建设的典型代表 11月11日以"聚智成金 融跃科技"为主题"互联网时代金融+速戴尔金融行业技术创新峰会"在苏州召开在新形势下,金融业如何加速转型科技如何更好助力成为摆在大家面前的重要话题 更快捷.更灵活.更弹性,金融业IT架

一位想学很多的大一同学

[来信] --(一封标点.断句都很乱的信,作者甚至写完都没有再看.) [回复] 信结尾你说,说得有点乱.我在读的中间,要不是想看明白,也真觉得读不下去了.这是一封你一边想一边写出来的文字,想的中间有跳跃. 犹豫之后,我决定给你提出要求,请你将这封信重新整理后再给我发来.要知道,这封信如果是求职信,或是工作后给领导汇报工作的信,可能你失去机会的原因就是这个.你感觉自己的学习有些乱,大概这封信就是最贴切的写照. 这是你让别人明白的必要.我写的文字不少,现在也习惯了写完后,自己要至少看一遍,要交待的事