【问题标题】:Recursive Sets vs Recursive Functions递归集与递归函数
【发布时间】:2010-12-23 15:06:34
【问题描述】:

递归集和递归函数有什么区别?

【问题讨论】:

  • 集合和函数是两个完全不同的东西,“递归”只是一个形容词。青苹果和绿色汽车有什么区别?
  • 它们都是绿色的!! ...哦,你的意思是有什么区别..

标签: computer-science theory formal-languages


【解决方案1】:

递归函数和递归集是可计算性理论中使用的术语。*对它们的定义如下:

如果有一个图灵机,给定一个数 n,如果 n 在如果 n 不在集合中,则设置并停止输出 0。如果有一个图灵机在输入 n 上停止并返回输出 f(n),则从自然数到自身的函数 f 是递归或(图灵)可计算函数。

在这种情况下,递归函数并不意味着在编程语言中调用自身的函数。任何满足上述定义要求的数学函数都是递归函数,包括普通函数,例如恒等函数或将所有数字映射为1的函数(即无论输入如何都返回数字1)。

【讨论】:

  • 至少在灰色地带。这绝对是计算机科学,但可能不是编程,这取决于画线的位置。
【解决方案2】:

这些术语的含义因您的上下文而异。如果我们纯粹从编写程序的角度来讨论它们,那么 递归集 没有多大意义;但是,可能只是我遇到过。也就是说,递归函数是在执行过程中调用自身的函数。第nthFibonacci 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ℕ的集合是一个递归集合,因为我们可以定义一个递归函数如下:

f 定义为一个函数,其中 f(x) = 1 如果 x ∈ ℕ 并且 f(x) = 0 如果 x ∉ ℕ

递归集的概念对于可计算性的概念很重要,因为它导致了recursively enumerable set,这是一种可以被Turing machine(即Turing-recognizable)识别的语言。这些是图灵机可能无法确定给定字符串是否是语言成员的语言,或者换句话说,机器可能接受拒绝 或 loop。 这与 Turing-decidable 语言相反,机器将进入 acceptreject 给定输入字符串的状态。

这正是 递归函数 的概念发挥作用的地方,因为递归函数(或总递归函数)可以由图灵机计算并在每次输入时停止。其中,部分递归函数只能为图灵机计算,而不能保证停止行为。或者本质上,递归函数是递归集的对应物。

因此,回到您最初的问题,在计算理论的上下文中,递归集是可以生成(即枚举)或通过图灵机上的递归函数测试成员资格的集合。

进一步阅读:

【讨论】:

    【解决方案3】:

    也许问题应该是“为什么用‘递归’这个词来描述集合和函数?”

    正如 Greg Hewgill 在他的评论中指出的那样,“绿色”这个词可以用于苹果和汽车,但这并不意味着苹果和汽车之间存在关系。

    我认为来自 Wikipedia 的引用使用术语“递归”作为“可计算”的同义词——作为程序员,我们会谨慎地同意这一点,但仅限于某些情况下。

    【讨论】:

    • 没有。我不同意。 -1 。我正在阅读 David 和 Weyuker 的 Computability, Complexity and Languages,以及 Sipser 的 Theory of Computation。我知道他们被这样称呼的原因。
    • 这是你的特权。将我们描述为“程序员”是我的错误吗?很抱歉,但大多数 SO 用户都为这个标题感到自豪。