Recursion 什么是递归可枚举集?

Recursion 什么是递归可枚举集?,recursion,computer-science,set,Recursion,Computer Science,Set,关于这个话题,维基百科似乎有很多(和困惑)。谷歌抛出的其他结果不能免费供公众使用 我很想听听大家怎么说。递归可枚举集是一个集合,其中有一个部分可计算的算法来决定元素是否包含在集合中(可以计算,但不一定会终止) 例如,确定mandlebrot集合中的一个项目是否不可递归枚举。这里有一个定义:递归枚举集合是一个集合,您可以在其中编写程序,输出集合中的每个元素:E1、E2、E3。。。如果这个节目不停也没关系 人们通常在语言的语境中谈论这一点。递归可枚举语言是一种可以编写程序以写出该语言中所有有效字符串

关于这个话题,维基百科似乎有很多(和困惑)。谷歌抛出的其他结果不能免费供公众使用


我很想听听大家怎么说。

递归可枚举集是一个集合,其中有一个部分可计算的算法来决定元素是否包含在集合中(可以计算,但不一定会终止)


例如,确定mandlebrot集合中的一个项目是否不可递归枚举。

这里有一个定义:递归枚举集合是一个集合,您可以在其中编写程序,输出集合中的每个元素:E1、E2、E3。。。如果这个节目不停也没关系

人们通常在语言的语境中谈论这一点。递归可枚举语言是一种可以编写程序以写出该语言中所有有效字符串的语言。一种语言只是一组字符串,所以“以10为底的所有素数的集合”是一种有效的语言

但是,假设您不想生成语言中的所有字符串或集合中的所有元素。您只需要检查并查看给定字符串是否在该语言中。问题是,您永远无法确定字符串不是您的语言。如果你需要为这种语言编写一个编译器,你的编译器可以在有效输入上正常工作,但是无效输入会使你的编译器在无限列表中搜索不存在的东西时永远挂起

“递归语言”或“递归集”集合是可以编写程序来告诉您给定输入是否在集合中的集合。所有递归语言都是递归可枚举的,因为您可以只枚举每个字符串,然后在集合中输出它。递归语言也称为可判定语言,因为您可以确定元素是否在其中。对于更一般的递归可枚举集,情况并非如此


一般来说,证明一个集合或语言是递归可枚举的或是递归的比较容易,但证明它不是递归的而是递归可枚举的比较难。

这个概念最好用例子和递归集合的比较以及不同定义的比较来说明。所以我会这样做:我先给你们举个例子,然后给你们不同的(但相当的)定义

首先,请注意,从技术上讲,我们将形容词“递归可枚举”(也称为“半可判定”)用于自然数集。但这个形容词也适用于一组整数,一组整数对,一组Unicode字符串。请注意,任何这些东西(整数、整数对、Unicode字符串)都可以存储在计算机内存中。(不能存储在计算机内存中的东西包括任意(无限精度)实数和0或1的无限序列)

例1:所有素数的集合

您可以编写一个算法,将自然数作为输入,并返回是或否的答案(是表示“是,该输入是素数”,否表示“不,该输入不是素数”)。该算法易于编写。如果您不为获得更好的性能而进行优化,那么这非常容易。因为您可以编写一个始终完成并给出是或否答案的算法,所以所有素数的集合称为可判定集(也称为递归集)。之所以称之为可判定,是因为你可以判定一个自然数是否为素数。注意,如果你想证明一个集合是一个可判定的集合,你只需要想出一个算法,它总是能给出正确的答案,而不需要优化性能。让我们不要讨论它为什么被称为递归

例2。质数间隔是两个连续质数之间的差。例如,13是一个素数,下一个素数是17,因此它们的差4是一个素数间隙。我们的第二个例子是所有素数间隙的集合

你能写一个算法来检查一个数字是否是素数间隔吗?下面的伪代码怎么样

input: x

set i to 1
loop
  check primeness of i, i+1, ..., i+x
  if only i and i+x among them are primes, return yes.
  otherwise, increment i by 1 and go to start of loop
该算法在伪代码中有一些好的,也有一些坏的

坏:如果输入不是一个主要间隙,它将永远不会结束。它永远不会返回否定的答案

好处:如果它返回的答案是肯定的,那么您肯定知道输入是一个基本间隙,反之亦然

此集合是半可判定集合(也称为递归可枚举集合)的示例。如果您输入一个素数间隔并等待足够长的时间,该算法将始终为您提供肯定的确认,但如果您输入的数字不是素数间隔,则该算法不会为您提供否定的确认

定义:如果有一个算法接受一个输入并返回yes或no或从不返回(由于无限循环或错误),如果该算法在集合中给出一个输入时返回yes,如果该算法在集合之外给出一个输入时从不返回yes,那么集合就是半可判定集合

所有的圆都是椭圆,所有的可判定集都是半可判定集

经过一些思考,您可能会意识到,算法是否允许返回no有时是正确的,对于最终的定义来说并不重要。经过更多的思考,您可能还会意识到,是否允许错误对定义也不重要。这些认识使我们能够得出一个等效的、更简单但稍不直观的定义:

不那么直观的定义是:如果有一个算法接受输入,并且该算法返回(即程序终止),当且仅当集合中有一个输入时,集合才是半可判定集合

现在让我们来讨论列表集。集合是可列出的集合