书本信息:
作者: [美] Eric Lehman / [美] F. Thomson Leighton / [美] Albert R. Meyer
出版社: 电子工业出版社
出品方: 博文视点
副标题: 信息与智能时代的必修课
原作名: Mathematics for Computer Science
07 递归数据类型
文章目录
1、递归定义和结构归纳法
1.1 递归定义 (Recursive Definition)
递归定义是一种定义事物的方法,其中定义本身引用了正在被定义的事物。这种定义通常包括两部分:
- 基本情形 (Base Case): 这是不涉及递归的明确定义部分,指明属于该数据类型的某个已知基本元素。
- 构造情形 ( Constructor case): 这是定义中递归的部分,指明如何从已知基本元素或已构建的元素,构造新的元素。
1.2 结构归纳法 (Structural Induction)
结构归纳法是对递归定义的数据类型的性质进行证明的方法。结构归纳法的证明通常包括以下两个步骤:
- 证明基本情形对应的元素具有某种性质。
- 证明当构造情形用具有该性质的元素生成新的元素时,新的元素也具有该性质。
2、匹配带括号的字符串
书中介绍了如何按照递归数据类型的方式定义匹配字符串( matched string),并证明了它的一些性质,不再赘述
匹配字符串在计算机科学早期用于表达式解析( Expression Parsing),例如:
x
+
y
∗
z
2
−
y
+
7
x + y * z^2 - y + 7
x+y∗z2−y+7
给这样的表达式加上括号,以确定应它的确切含义是
[
[
x
+
y
]
∗
z
2
−
y
]
+
7
[[x + y] * z^2 - y] + 7
[[x+y]∗z2−y]+7
还是
x
+
[
y
∗
z
2
−
[
y
+
7
]
]
x + [y * z^2 - [y + 7]]
x+[y∗z2−[y+7]]
还是
[
x
+
[
y
∗
z
2
]
]
−
[
y
+
7
]
[x + [y * z^2]] - [y + 7]
[x+[y∗z2]]−[y+7]
或者其他?
3、非负整数上的递归函数
非负整数ℕ的递归定义如下:
0 ∈ ℕ \\
若n ∈ ℕ,则n + 1 ∈ ℕ
3.1 ℕ上的一些标准递归函数
阶乘的递归定义:
0!::= 1 \\
当n≥0时,(n+1)! ::=(n+1)×n!
求和的递归定义:
\sum_{i=1}^{0}f(i) ::= 0 \\
当n≥0时,\sum_{i=1}^{n+1}f(i) ::= f(n+1) + \sum_{i=1}^{n}f(i)
3.2 不规范的函数定义
用递归定义方法时应当注意,方法的递归定义应当遵循数据类型的递归定义,否则的话会得到一些奇怪的函数。
书中还列举了考拉兹猜想(Collatz conjecture)和阿克曼函数(Ackermann function)的例子,但是给出的阿克曼函数与我们通常看到的定义不太一样。
4、算术表达式
书中介绍了如何使用递归来定义算术表达式,并以求值和变量替换为例介绍了如何使用递归来定义方法,不再赘述。
5、计算机科学中的归纳
强归纳法和一般归纳法都可以用来证明任意定义在非负整数集上的事情,包括逐步计算过程。
结构归纳法进一步摆脱了计数的限制,为证明递归数据类型和递归计算提供了一种简单有效的方法。