递归集和递归函数之间有什么区别?
答案 0 :(得分:8)
递归函数和递归集是可计算性理论中使用的术语。维基百科将它们定义如下:
一组自然数被称为可计算集(也称为可判定,递归或图灵可计算集),如果存在图灵机,给定数n,如果n在n中,则输出1停止如果n不在集合中,则设置并停止输出0。如果有一个图灵机在输入n上停止并返回输出f(n),则从自然数到自身的函数f是递归或(图灵)可计算函数。
在这种情况下,递归函数并不意味着调用自身的编程语言中的函数。满足上述定义要求的任何数学函数都是递归函数,包括平凡函数,如标识函数或将所有数字映射到1的函数(即无论输入如何都返回数字1)。
答案 1 :(得分:6)
这些术语的含义因您的具体情况而异。如果我们纯粹从编写程序的角度讨论它们,那么递归集没有多大意义;然而,它可能只是我遇到过它。也就是说,递归函数是在执行时调用自身的函数。 n th Fibonacci number的计算是常见的典型例子:
/// <summary>A C# implementation of a function to return the nth Fibonacci number.</summary>
private static int Fibonacci(int n) {
if (n <= 2) {
return 1;
} else {
return Fibonacci(n - 1) + Fibonacci(n - 2);
}
}
也就是说,在计算机科学,特别是计算理论的背景下,这些术语的另一个背景是在讨论formal languages时。在此上下文中,递归集被定义为具有可解决的成员资格问题的集合。例如,我们知道所有natural numbers set的集合都是递归集合,因为我们可以按如下方式定义递归函数:
将 f 定义为其中的函数 f(x)= 1 如果x∈ℕ和 f(x)= 0 如果 x∉ℕ
递归集的概念对于可计算性的概念很重要,因为它导致recursively enumerable set这是一种可被Turing machine识别的语言(即Turing-recognizable)。这些是图灵机可能或可能无法确定给定字符串是否是语言成员的语言,或者换句话说,机器可以接受,拒绝< / em>,或循环。这与Turing-decidable语言形成鲜明对比,机器将进入 accept 或 reject < / em>给定输入字符串的状态。
这是递归函数的概念,因为递归函数(或总递归函数)可以由图灵机计算并停止每个输入。其中,只能为图灵机计算部分递归函数,而不能保证停止行为。或者本质上,递归函数是递归集的对应物。
因此,为了使问题回归到原始问题,在计算理论的上下文中,递归集是可以生成(即枚举)或通过图灵机上的递归函数测试成员资格。
进一步阅读:
答案 2 :(得分:5)
也许问题应该是“为什么'递归'这个词用于描述集合和函数?”
正如Greg Hewgill在评论中指出的那样,“绿色”这个词可以应用于苹果和汽车,但这并不意味着苹果和汽车之间的关系。
我认为维基百科的引用使用“递归”一词作为“可计算”的同义词 - 作为程序员,我们会谨慎地同意这一点,但仅限于某些情况。