递归

转自:https://yq.aliyun.com/articles/72757?utm_campaign=wenzhang&utm_medium=article&utm_source=QQ-qun&2017329&utm_content=m_15284

数论函数

自然数集一般记为 N={0,1,2,} N={0,1,2,⋯},那么 n n个自然数集的笛卡尔积记为 Nn Nn
于是,我们称集合 Nn Nn N N的部分函数为 n n元部分数论函数。
作为数论函数, 2x 2x是一个全函数,而 x/2 x/2 xy x−y x x只是部分函数,
它们的计算结果, 3/2 3/2 46 4−6 5 5都不在 N N中,于是相应定义域中的点可视为没有定义。

为什么讨论数论函数呢,其一是因为它是一个典型数学的问题,
另外一点,则是因为我们经常把其他数学问题转换成数论问题,例如,哥德尔编码
本文中,使用数论函数,可以简化我们的描述方式。

一个谓词,指的是返回布尔值的函数,
我们还可以将谓词看做值域为 {0,1} {0,1}的一个数论函数。
0 0代表True 1 1代表False

极小化算子

前一篇中,我们从三个初始函数出发,
通过合成运算和原始递归运算,得到了原始递归函数集,
递归函数集是相对于这两种运算封闭的。

然而,这样定义的原始递归函数,并不能包括所有的数论函数,
一个典型的例子就是,阿克曼函数

ackermann :: Int -> Int -> Int
ackermann 0 x = x+1
ackermann k 0 = ackermann (k-1) 1
ackermann k x = ackermann (k-1) $ ackermann k x-1

它并不是一个原始递归函数,(证略
因此原始递归函数集并不足以表示计算机程序中的所有函数。

为此,我们需要对原始递归函数集进行扩充,我们定义一个新的运算,称为极小化运算,
P(x1,,xn,t) P(x1,⋯,xn,t)是一个谓词,令
f(x1,,xn)=min P(x1,,xn,t) f(x1,⋯,xn)=min P(x1,⋯,xn,t)

f(x1,,xn) f(x1,⋯,xn)的值,或者是使 P(x1,,xn,t) P(x1,⋯,xn,t)为真的最小 t t值,
或者无定义,此时不存在 t t使得 P(x1,,xn,t) P(x1,⋯,xn,t)为真。
这样通过 min min得到 f(x1,,xn) f(x1,⋯,xn)的过程称为极小化运算,
也称部分函数 f(x1,,xn) f(x1,⋯,xn)是由谓词经过极小化运算得到的。

以上我们给谓词定义了极小化运算,现在我们将极小化运算推广到一般的函数上面,
g(x1,,xn,t) g(x1,⋯,xn,t)是一个 n+1 n+1元函数,令
f(x1,,xn)=min{g(x1,,xn,t)=0} f(x1,⋯,xn)=min{g(x1,⋯,xn,t)=0}
则称部分函数 f(x1,,xn) f(x1,⋯,xn)是由函数 g(x1,,xn,t) g(x1,⋯,xn,t)经过极小化运算得到的。

递归函数集

和定义原始递归函数集一样,我们从以下三个初始函数出发,
(1)零函数 n(x)=0 n(x)=0
(2)后继函数 s(x)=x+1 s(x)=x+1
(3)投影函数 uni(x1,,xn)=xi uin(x1,⋯,xn)=xi iin i⩽i⩽n
由初始函数,经过有限次合成运算,原始递归运算,以及极小化运算,得到的函数称为递归函数。

递归函数并不一定是全函数,因为极小化运算可能会导致结果函数在某些点无定义,
递归的部分函数称为部分递归函数。

可以证明阿克曼函数是递归函数,但不是原始递归函数,
因此,原始递归函数集是递归函数集的真子集。

递归可枚举集

在具体实践中,我们经常会遇到这样的问题,
给定一个元素,我们需要判断这个元素是否属于某个集合。
这种问题,称为集合的成员资格问题。

沿用这一思路,我们可以使用一个谓词 χB χB来定义相应的集合 BN B⊆N
B={xN|χB(x)} B={x∈N|χB(x)}
谓词 χB(x) χB(x)为真,则 xB x∈B
这个谓词 χB(x) χB(x),通常称为集合 B B的特征函数。

如果特征函数 χB χB是第一个递归的全函数,
则我们总是可以判断 χB(x) χB(x)等于 0 0还是 1 1
这样的集合 B B称为递归集。

如果存在部分递归函数 g g,使得 B={xN|g(x)} B={x∈N|g(x)↓}
即, xB x∈B当且仅当 g g x x处有定义,
则称集合 B B是一个递归可枚举集。

因此,对于每一个自然数 xN x∈N
我们总是可以通过递归集 B B的特征函数 χB χB,来判断 x x是否 B B的成员。
而对于递归可枚举集,就不容乐观了,
如果某个自然数 xN x∈N B B的成员,那么我们可以断定这件事,因为 g(x) g(x)有定义,
但是如果某个自然数 yN y∈N不是 B B的成员,我们就不能确定,因为这时候 g(x) g(x)无定义。
g(x) g(x)无定义,则它对应的图灵机不停机,后文我们详细讨论

因此,集合 B B是递归的当且仅当 B B B¯ 是递归可枚举的,
其中 B¯ B B的补集。

总结

本文介绍了数论函数,递归函数集,然后用递归函数分别定义了递归集和递归可枚举集,
可是为什么递归可枚举集是“可枚举”的呢?

是因为每一个递归可枚举集可以一一对应一个自然数,这是怎样做到的呢?
这需要我们理解总共有多少个可能的程序,以及什么是通用程序。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值