sicp 2.4节小题尝试解答
2023-03-14 10:14:03 时间
这一节那是相当的有趣,抽象数据的多重表示:采用标志(tag)来区分和数据导向(data-directed)技术,稍微提了下消息传递。通过一张二维表格将类型、操作的分派机制介绍的很清楚,静态OO语言正是通过类型来决定消息的分派,而消息传递以列进行划分,每个类型都以过程来表征,也就是所谓的“智能数据对象”,两者各有优缺点。当类型增加频繁时,消息传递风格的分派更容易扩展,当操作增加频繁时,反而是显式的类型分派更为容易扩展,这一点如果有OO设计经验应该很容易体会。
看看习题:
习题2.73,将求导程序以数据导向方式进行修改:
a)题目已经说了,基于被求导表达式的类型进行分派,加法表达式或者乘法表达式都有标志来区分,而number?和variable?并没有标志进行区分,因此无法加入数据导向分派。
b)选择函数不变,将求导过程提取出来,根据表达式类型划分,然后用put过程安装:
c)我没做,不过和b差不了多少
习题2.75,很简单,跟着书上来:
看看习题:
习题2.73,将求导程序以数据导向方式进行修改:
a)题目已经说了,基于被求导表达式的类型进行分派,加法表达式或者乘法表达式都有标志来区分,而number?和variable?并没有标志进行区分,因此无法加入数据导向分派。
b)选择函数不变,将求导过程提取出来,根据表达式类型划分,然后用put过程安装:
(define (deriv-sum exp var)
(make-sum (deriv (addend exp) var)
(deriv (augend exp) var)))
(define (deriv-prod exp var)
(make-sum
(make-product (multiplier exp)
(deriv (multiplicand exp) var))
(make-product (deriv (multiplier exp) var)
(multiplicand exp))))
(define (install-deriv-package)
(put 'deriv '+ deriv-sum)
(put 'deriv '* deriv-prod)
'done)
(make-sum (deriv (addend exp) var)
(deriv (augend exp) var)))
(define (deriv-prod exp var)
(make-sum
(make-product (multiplier exp)
(deriv (multiplicand exp) var))
(make-product (deriv (multiplier exp) var)
(multiplicand exp))))
(define (install-deriv-package)
(put 'deriv '+ deriv-sum)
(put 'deriv '* deriv-prod)
'done)
c)我没做,不过和b差不了多少
习题2.75,很简单,跟着书上来:
(define (make-from-mag-ang r a)
(define (dispatch op)
(cond ((eq? op 'real-part) (* r (cos a)))
((eq? op 'imag-part) (* r (sin a)))
((eq? op 'magnitude) r)
((eq? op 'angle) a)
(else
display "Unknow op")))
dispatch)
(define (dispatch op)
(cond ((eq? op 'real-part) (* r (cos a)))
((eq? op 'imag-part) (* r (sin a)))
((eq? op 'magnitude) r)
((eq? op 'angle) a)
(else
display "Unknow op")))
dispatch)
将极角坐标系表示的复数用dispatch过程来表示,这正是消息传递风格。
习题2.76,在本文开头已经提了。
文章转自庄周梦蝶 ,原文发布时间 2007-07-20
相关文章
- 音视频开发之音频基础知识!
- 自定义FlowLayout,android flowLayout实现
- Ffmpeg编码实战!
- 空间转录组2022||空间数据反卷积RCTD分析:full mode on Visium hippocampus
- scMethBank:单细胞全基因组 DNA 甲基化图谱在线数据库
- android Fragment单页面加载,避免重复加载(懒加载)分析
- MySQL使用多因素身份认证
- MySQL全面的在线文档
- MySQL安装、升级篇——RPM
- C语言联合体(共用体)使用方法及大小计算
- 数据分享|R语言用主成分PCA、 逻辑回归、决策树、随机森林分析心脏病数据并高维可视化|附代码数据
- R语言广义线性模型(GLM)、全子集回归模型选择、检验分析全国风向气候数据|附代码数据
- GIS空间数据模型: 注记文本模型
- 地理空间索引实现:z 曲线、希尔伯特曲线、四叉树, 最邻近几何特征查询、范围查询
- flask + pyecharts 搭建新冠肺炎疫情数据可视化交互分析平台:包含疫情数据获取、态势感知、预测分析、舆情监测等任务
- ArcEngine + DevPress GIS二次开发:湖北疫情交互式数据分析、地图输出、专题可视化系统 具体实现
- 编译过程中的并行性优化(二):基本块与全局代码调度算法
- 地理空间数据库复习笔记:概论、关系模型与关系代数
- (本地无法连接MySQL服务器)ERROR 2003 (HY000): Can‘t connect to MySQL server on ‘localhost‘ (10061)
- MySQL数据库时区错误,设置时区