计算机程序的构造和解释(笔记)
3.3用变动数据做模拟
写在开头:这节看得都不是很懂,以后有机会在翻翻,毕竟SICP是值得反复看的书
数据结构:
- 改变函数:能够修改有关的数据对象
- 构造函数:用于创建数据对象
- 选择函数:用于访问符合数据对象中的各个部分
变动数据对象定义:定义了改变函数的数据对象
3.3.1 变动的表结构
- 序言
这里说的是指针指向的不相同,得到的表结构不一样;
有点绕,也有点不太懂具体可以看书上的例子
这里有两个改变表的函数:
-
- set-car! 要求两个参数,第一个参数是一个序对,第二个为修改的序对(car)的指针
-
set-cdr! 与set-car!类似,不过其取代的是序列cdr的指针
共享和相等
这里说的应该符合共享不是很懂,比深拷贝和浅拷贝的感觉复杂
习题说的是比较传统的链表判断有没有环的问题,一般的两个解法:
设置一个唯一的标识符 identity;遍历列表,看是否已经遍历过了;需要额外的空间
使用两个变量,一个变量以步长为 1 遍历列表,另一个变量以步长为 2 遍历列表,每次在两个变量移动之后对比它们,如果两个变量相遇,那么列表有环
3.3.2 队列的表示
也和数据结构上的用链表实现的差不多(首尾两个指针),支持的操作也是pop(),push()等
(define (front-ptr queue) (car queue))
(define (rear-ptr queue) (cdr queue))
(define (set-front-ptr! queue item)
(set-car! queue item))
(define (set-rear-ptr! queue item)
(set-cdr! queue item))
其底层实现图像结构如下:
3.3.3 表格的表示
这里说的表是一个key-value的匹配,类似c++里的map,但没有hash等技术实现快速查询等
例如, 对于:
- 一维表格
a: 1
b: 2
c: 3
其Scheme实现为
(define (lookup key table) ; 查找
(let ((record (assoc key (cdr table))))
(if record
(cdr record)
false)))
(define (assoc key records) ; 返回关键码为car的记录
(cond ((null? records) false)
((equal? key (caar records)) (car records))
(else (assoc key (cdr records)))))
这里也说到保存其头部使用了dummy node的技巧
- 二维表格
两个索引咯
- 创建局部表格
这里说的是表格的一些操作
3.3.4
这里说的是数字电路上的内容,与非门、半加器和全加器等的scheme实现;
好困,不想看着数电部分,跳过(;′⌒`)
3.3.5 约束的实现
暂且不表。。。