计算机程序的构造和解释

第1章  构造过程抽象
1.1 程序设计的基本元素
1.1.1 表达式
1.1.2  命名和环境
1.1.3  组合式的求值
1.1.4  复合过程
1.1.5  过程应用的代换模型
1.1.6  条件表达式和谓词
1.1.7  实例:采用牛顿法求平方根
1.1.8  过程作为黑箱抽象
1.2 过程与它们所产生的计算
1.2.1  线性的递归和迭代
1.2.2  树形递归
1.2.3  增长的阶
1.2.4  求幂
1.2.5  最大公约数
1.2.6  实例:素数检测
1.3 用高阶函数做抽象
1.3.1  过程作为参数
1.3.2  用lambda构造过程
1.3.3  过程作为一般性的方法
1.3.4  过程作为返回值
笫2章  构造数据抽象
2.1 数据抽象导引
2.1.1  实例:有理数的算术运算
2.1.2  抽象屏障
2.1.3  数据意味着什么
2.1.4  扩展练习:区间算术
2.2 层次性数据和闭包性质
2.2.1  序列的表示
2.2.2  层次性结构
2.2.3  序列作为一种约定的界面
2.2.4  实例:一个图形语言
2.3 符号数据
2.3.1  引号
2.3.2  实例:符号求导
2.3.3  实例:集合的表示
2.3.4  实例:Huffman编码树
2.4 抽象数据的多重表示
2.4.1  复数的表示
2.4.2  带标志数据
2.4.3  数据导向的程序设计和可加性
2.5 带有通用型操作的系统
2.5.1  通用型算术运算
2.5.2  不同类型数据的组合
2.5.3  实例:符号代数
第3章  模块化、对象和状态
3.1 赋值和局部状态
3.1.1  局部状态变量
3.1.2  引进赋值带来的利益
3.1.3  引进赋值的代价
3.2 求值的环境模型
3.2.1  求值规则
3.2.2  简单过程的应用
3.2.3  将框架看作局部状态的展台
3.2.4  内部定义
3.3 用变动数据做模拟
3.3.1  变动的表结构
3.3.2  队列的表示
3.3.3  表格的表示
3.3.4  数字电路的模拟器
3.3.5  约束的传播
3.4 并发:时间是一个本质问题
3.4.1  并发系统中时间的性质
3.4.2  控制并发的机制
3.5 流
3.5.1  流作为延时的表
3.5.2  无穷流
3.5.3  流计算模式的使用
3.5.4  流和延时求值
3.5.5    函数式程序的模块化和对象的模块化
第4章  元语言抽象
4.1 元循环求值器
4.1.1  求值器的内核
4.1.2  表达式的表示
4.1.3  求值器数据结构
4.1.4  作为程序运行这个求值器
4.1.5  将数据作为程序
4.1.6  内部定义
4.1.7  将语法分析与执行分离
4.2 Scheme的变形--惰性求值
4.2.1  正则序和应用序
4.2.2  一个采用惰性求值的解释器
4.2.3  将流作为惰性的表
4.3 Scheme的变形--非确定性计算
4.3.1  amb和搜索
4.3.2  非确定性程序的实例
4.3.3  实现arab求值器
4.4 逻辑程序设计
4.4.1  演绎信息检索
4.4.2  查询系统如何工作
4.4.3  逻辑程序设计是数理逻辑吗
4.4.4  查询系统的实现
第5章  寄存器机器里的计算
5.1 寄存器机器的设计
5.1.1  一种描述寄存器机器的语言
5.1.2  机器设计的抽象
5.1.3  子程序
5.1.4  采用堆栈实现递归
5.1.5  指令总结
5.2 一个寄存器机器模拟器
5.2.1  机器模型
5.2.2  汇编程序
5.2.3  为指令生成执行过程
5.2.4  监视机器执行
5.3 存储分配和废料收集
5.3.1  将存储看作向量
5.3.2  维持一种无穷存储的假象
5.4 显式控制的求值器
5.4.1  显式控制求值器的内核
5.4.2  序列的求值和尾递归
5.4.3  条件、赋值和定义
5.4.4  求值器的运行
5.5   编译
5.5.1  编译器的结构
5.5.2  表达式的编译
5.5.3  组合式的编译
5.5.4  指令序列的组合
5.5.5  编译代码的实例
5.5.6  词法地址
5.5.7  编译代码与求值器的互连

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
1,过程作为返回值 在1.3中我们明白了高阶函数之后,“用一个过程作为另外一个过程的返回值”则是稀松平常的事情了,比如下面的代码: (define (f x) (+ x 1)) (define (g) f) ((g) 2) 函数g没有参数,其返回值为函数f,所以((g) 2)就运算结果就是(f 2),最后运算结果为3。 上面是用一个已命名的函数作为返回结果的,相应的,也可以将一个“匿名过程”作为结果返回,这里的“匿名过程”也就是我们的Lambda表达式,所以上面的代码可以改造成: (define (g) (lambda (x) (+ x 1))) ((g) 2) 那么((g) 2)的运算结果就是((lambda (x) (+ x 1)) 2),最后运算结果为3。 2,牛顿法 学到这里,你可能需要复习一下高等数学的基本内容,包括“导数”和“微分”,高数的在线教材可以在这里找到:http://sxyd.sdut.edu.cn/gaoshu1/index.htm 关于牛顿法的介绍可以看这里:http://en.wikipedia.org/wiki/Newton%27s_method ,下面是程序: (define (close-enough? v1 v2) (< (abs (- v1 v2)) 0.000000001)) ;定义不动点函数 (define (fixed-point f first-guess) (define (try guess step-count) (let ((next (f guess))) (if (close-enough? guess next) next (try next (+ step-count 1))))) (try first-guess 0)) ;定义导数函数 (define (D f) (lambda (x dx) (/ (- (f (+ x dx)) (f x)) dx))) ;牛顿法 (define (newton g first-guess) (fixed-point (lambda (x) (- x (/ (g x) ((D g) x 0.000000001)))) first-guess)) ;平方 (define (square x) (* x x)) ;定义开方,来测试下牛顿法 (define (sq x) (newton (lambda (y) (- (square y) x)) 1.0)) (sq 5) 3,“一等公民” 这里列出了程序语言中作为“一等公民”的语言元素所具备的几个“特权”: 可以用变量命名 可以作为过程参数 可以作为过程返回结果 可以被包含在数据结构中 4,练习1.40 求三次方程 x^3 + ax^2 + bx + c 的零点。 首先,证明 函数f(x) = x^3 + ax^2 + bx + c 是“可微”的: 由可导和可微的性质知道,可导和可微互为充要条件,所以,要证可微我们可以先证可导, f ’ (x) = (x^3)’ + (ax^2)’ + (bx)’ + (c)’ = 3x^2 + 2ax + b 所以f(x)的导数存在,那么f(x)可导,其必定可微。 其次,利用“牛顿法”:如果f(x)是可微函数,那么f(x)=0的一个解就是函数(x – f(x)/df(x)的一个不动点,其中df(x)是f(x)的导数。所以我们可以轻松得到下面的代码: (define (close-enough? v1 v2) (< (abs (- v1 v2)) 0.000000001)) ;定义不动点函数 (define (fixed-point f first-guess) (define (try guess step-count) (let ((next (f guess))) (if (close-enough? guess next) next (try next (+ step-count 1))))) (try first-guess 0)) ;定义导数函数 (define (D f) (lambda (x dx) (/ (- (f (+ x dx)) (f x)) dx))) ;牛顿法 (define (newton g first-guess) (fixed-point (lambda (x) (- x (/ (g x) ((D g) x 0.000000001)))) first-guess)) ;定义cubic函数,也就是我们题目中所谓的f(x) (define (cubic a b c) (lambda (x) (+ (* x x x) (* a x x) (* b x) c))) ;随便定义几个系数 (define a 3) (define b 5) (define c 8) (define result (newton (cubic a b c) 1.0)) ;定义一个验证过程,让其验证得到的解,是否让方程成立 (define (validate x) (= 0 (+ (* x x x) (* a x x) (* b x) c))) ;输出结果 result ;验证结果 (validate result) 比如上面我们计算 x^3 + 3x^2 + 5x + 8 = 0, 其一个解为:-2.3282688556686084 .....
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值