该文章内容涉及一部分递归的内容,和程序正确性的内容,递归的应用将会在算法中得到的广泛应用,在离散数学的内容中也是极其重要的,它是一种定义的手段和解决问题的方法。总之递归在任何时候都是一种极其重要的方法。其次是程序正确性,程序正确性在大部分时候是被忽视的,但我认为程序正确性是保证数学与程序联系的重要依据,将一个数学问题,数学方法快速的变为程序,变为it行业的生产力。研究与学习程序正确性是一种有效的方法。
1. 递归
关于数学归纳法的内容就不写了,直接写递归了,我还是偏向工程性强的内容。
直接来看看递归定义的使用。
- 递归的定义函数
为了定义非负整数集合作为其定义域的函数,使用两个步骤:
基础步骤:规定这个函数在0处的值。
递归步骤:给出从较小的整数处的值来求出当且的值的规则
- 递归的定义集合
字母表 Σ \Sigma Σ上的字符串的集合 Σ ∗ \Sigma^* Σ∗递归的定义为:
基础步骤: λ ∈ Σ ∗ \lambda \in \Sigma^* λ∈Σ∗(其中 λ \lambda λ是不包含任何符号的空串)。
递归步骤:若 ω ∈ Σ ∗ \omega \in \Sigma^* ω∈Σ∗且 x ∈ Σ x\in \Sigma x∈Σ时,则 ω x ∈ Σ ∗ \omega x\in\Sigma^* ωx∈Σ∗。
- 递归的定义结构
一下这些步骤可以递归的定义根树的集合,其中根树是由一个顶点集合和连接这些顶点的边组成,顶点集合包含的一个特殊顶点,称为树根。
基础步骤:单个顶点r是根树
递归步骤:假设 T 1 , T 2 , . . . , T n T_1,T_2,...,T_n T1,T2,...,Tn是根树,分别带有树根 r 1 , r 2 , . . . , r n r_1,r_2,...,r_n r1,r2,...,rn。则如下形成的图也是根树:从树根r开始,r不属于根数 T 1 , T 2 , . . . , T n T_1,T_2,...,T_n T1,T2,...,Tn中的任何一个,从r到顶点 r 1 , r 2 , . . . , r n r_1,r_2,...,r_n r1,r2,...,rn每个都加入一条边。
此外递归还能定义更多的东西。
2. 递归算法
定 义 1 : 若 一 个 算 法 通 过 把 问 题 归 约 到 带 更 小 输 入 的 相 同 的 问 题 的 实 例 来 解 决 原 来 的 问 题 , 则 这 个 算 法 称 为 递 归 的 。 {\color{Purple}{定义\,1:}}\,若一个算法通过把问题归约到带更小输入的相同的问题的实例来解决原来的问题,\\则这个算法称为递归的。 定义1:若一个算法通过把问题归约到带更小输入的相同的问题的实例来解决原来的问题,则这个算法称为递归的。
递归算术的更多内容将会在算法导论中看到。
3. 程序正确性
程序与数学是密不可分的。
3.1 程序验证
如果确定一个程序是正确的呢?
简单来说,若对每个输入程序都产生正确的输出,则说这个程序是正确的。
一个程序的正确性证明需要两个部分。第一部分证明:若程序终止,则获得正确的答案。完成第一部分,则称程序是部分正确的。第二部分证明:程序总是终止。
定
义
1
:
若
当
一
个
程
序
或
程
序
段
S
的
输
入
值
来
说
初
始
断
言
p
为
真
时
,
就
有
对
S
的
输
出
值
来
说
终
结
断
言
q
为
真
,
则
说
S
是
相
对
于
p
和
q
部
分
正
确
的
。
记
号
p
{
S
}
说
明
程
序
或
程
序
段
S
是
相
对
于
初
始
断
言
p
和
终
结
断
言
q
部
分
正
确
的
。
{\color{Purple}{定义\,1:}}\,若当一个程序或程序段S的输入值来说初始断言p为真时,就有对S的输出值来说终结断言q为真,\\ 则说S是相对于p和q部分正确的。\\ 记号p\left\{S\right\}说明程序或程序段S是相对于初始断言p和终结断言q部分正确的。
定义1:若当一个程序或程序段S的输入值来说初始断言p为真时,就有对S的输出值来说终结断言q为真,则说S是相对于p和q部分正确的。记号p{S}说明程序或程序段S是相对于初始断言p和终结断言q部分正确的。
记号
p
{
S
}
q
p\left\{S\right\}q
p{S}q称为霍尔三元组。
3.2 推理规则
合成规则
p
{
S
1
}
q
q
{
S
2
}
r
∴
p
{
S
1
;
S
2
}
r
p\left \{S_1\right\}q\\ q\left \{S_2\right\}r\\ \therefore p\left\{S_1;S_2\right\}r
p{S1}qq{S2}r∴p{S1;S2}r
条件语句
对于条件语句
if condition then
S
将得到如下推理规则
(
p
∧
c
o
n
d
i
t
i
o
n
)
{
S
}
q
(
p
∧
┐
c
o
n
d
i
t
i
o
n
)
→
q
∴
p
(
i
f
c
o
n
d
i
t
i
o
n
t
h
e
n
S
)
q
(p\land condition)\left\{S\right\}q\\ (p\land ┐condition)\rightarrow q\\ \therefore p(if\,condition\,then\,S)q
(p∧condition){S}q(p∧┐condition)→q∴p(ifconditionthenS)q
如下条件语句
if condition then
S1
else
S2
将得到如下推理规则
(
p
∧
c
o
n
d
i
t
i
o
n
)
{
S
1
}
q
(
p
∧
┐
c
o
n
d
i
t
i
o
n
)
{
S
2
}
q
∴
p
{
i
f
c
o
n
d
i
t
i
o
n
t
h
e
n
S
1
e
l
s
e
S
2
}
q
(p\land condition)\left\{S_1\right\}q\\ (p\land ┐condition)\left\{S_2\right\}q\\ \therefore p\left\{if\,condition\,then\,S_1\,else\,S_2\right\}q
(p∧condition){S1}q(p∧┐condition){S2}q∴p{ifconditionthenS1elseS2}q
循环语句
在循环中将有一个循环不变量的概念
对于循环语句
while condition
S
每次执行S都为真的的断言,即是循环不变量
(
p
∧
c
o
n
d
i
t
i
o
n
)
{
S
}
p
∴
p
{
w
h
i
l
e
c
o
n
d
i
t
i
o
n
S
}
(
┐
c
o
n
d
i
t
i
o
n
∧
p
)
(p\land condition)\left\{S\right\}p\\ \therefore p\left\{while\,condition\,S\right\}(┐condition\land p)
(p∧condition){S}p∴p{whileconditionS}(┐condition∧p)