计算机程序的构造和解释(笔记)
1.1 程序设计的基本元素
1.1.1 表达式
前缀表达式:运算符在所有的对象左边
中缀表达式 以及 后缀表达式 定义见维基百科url
1.1.2 命名和环境
变量:名字标志符
环境:解释器必须维护的某种存储能力,以便保持有关的名字-值的轨迹
1.1.3 组合式的求值
树形表示法:
1.1.4 复合过程
Lisp的用法及格式:
1.1.5 过程应用的代换模型
实际参数: 组合式里那些运算对象的值
形式参数:局部环境中的变量
- 正则序: 完全展开而后约归,
- 应用序: 先求值参数而后应用
这里注意: 二者求值一般相同,但也有例外,例如下面习题:
1.1.6 条件表达式和谓词:
LISP的条件表达式形式为:
谓词:
(<p1> < e> ) 表达式中的第一个表达式<p>,它的值将被解释为真或者假
SCHEME 使用#f 表示flase ; 使用 #t 表示true;
1.1.7 实例: 采用牛顿法求平方根
- 说明性描述(是什么), 行动性描述(怎么做)
牛顿法求平方根法:
一般编程
double sqr(double n) {
double k=1.0;
while(abs(k*k-n)>1e-9) {
k=(k+n/k)/2;
}
return k;
}
迭代公式: X(n+1)=[X(n)+p/Xn]/2
C++ 实现
int main(){
double i = 1;
double p;
cin >> p;
while (abs(i*i - p) > 0.00001) {
i = (i + p / i) / 2;
cout << i << endl;
}
cout << i << endl;
cin >> p;
return 0;
}
1.1.8 过程作为黑箱抽象
约束变量: 在过程体中,形式参数的具体名字是什么没有关系;若一个变量不是被约束的,则它为自由的。
作用域: 一个名字的意义被约束于的那一集表达式称为这个名字的作用域。
捕获: 将自由变量变为约束变量