- 0
- 0
- 约1.93万字
- 约 19页
- 2017-06-19 发布于湖北
- 举报
1. 构造过程抽象(2)
要点:
过程内部定义和块结构
分析过程(静态,描述)产生的计算进程(动态,行为)
计算进程的类型
线性递归
线性迭代
树形递归
计算的代价
高阶过程:以过程为参数和/或返回值
程序设计技术和方法 裘宗燕,2011-2012 / 1
过程作为黑箱抽象
重新考察 sqrt 过程的定义,看看能学到什么
首先,它是递归定义的,是基于自身定义的
需要考虑这种“ 自循环定义”是否真有意义,后面将详细讨论
sqrt 分成一些部分实现
每项工作用一个独立过程完成
构成原问题的一种分解
分解合理与否的问题值得考虑
定义新过程时,用到的过程应看作黑箱,
只关注其功能,不关心其实现
例如,需要用求平方时,任何能计
算平方的过程都可以用
只要求它们的使用形式相同
程序设计技术和方法 裘宗燕,2011-2012 / 2
过程作为黑箱抽象
例如,只考虑功能(做什么),下面两个定义没有差别:
(define (square x) (* x x))
(define (square x) (exp (double (log x)))) ; 用的过程定义如下
(define (double x) (+ x x))
这是一件好事,程序里的部件应该有可替代性
过程抽象的本质:
定义过程时,关注所需计算的过程式描述细节(怎样做),使用时
只关注其说明式描述 (做什么)
一个过程总(应该)隐藏起一些实现细节,使用者不需要知道如何
写就可以用。所用过程可能是其他人写的,或是库提供的
过程抽象是控制和分解程序复杂性的重要手段,也是记录和重用已
有开发成果的单位
其他抽象机制也都有类似作用
程序设计技术和方法 裘宗燕,2011-2012 / 3
过程抽象:局部名字
过程中隐藏的最简单细节是局部名。下面两个定义没区别:
(define (square x) (* x x))
(define (square y) (* y y))
过程体里的形参:
具体名字不重要,重要的是哪些地方用了同一个形参
是过程体的约束变量(概念来自数理逻辑),作用域是过程体,约
束变量统一换名不改变结构的意义。其他名字是自由的
看过程 good-enough? 的定义:
(define (good-enough? guess x)
( (abs (- (square guess) x)) 0.001))
这里的 x 必然与 square 里的 x 不同
否则程序执行时不可能得到所需的效果
程序设计技术和方法 裘宗燕,2011-2012 / 4
过程抽象:局部名字
在 good-enough? 的定义里:
(define (good-enough? guess x)
( (abs (- (square guess) x)) 0.001))
guess 和 x 是约束变量,、-、abs 和 square 是自由(变量)
这个过程的意义正确,依赖于两个约束变量(形参)与四个自由变量
的名字不同,四个自由变量(在环境里关联)的意义正确
形参与所需自由变量重名导致该变量被“捕获” (原定义被屏蔽):
(define (good-enough? guess abs)
( (abs (- (square guess) abs)) 0.001))
自由变量(名字)的意义由运行时的环境确定,它可以是
内部过程或复合过程,需要应用它
有约束值的变量,计算中需要它的值
原创力文档

文档评论(0)