有什么东西只能通过递归来实现吗?

时间:2010-08-10 16:59:38

标签: algorithm recursion

我不确定,但我听说过只能通过递归实现的算法。有谁知道这件事吗?

5 个答案:

答案 0 :(得分:18)

您可以通过保留自己的堆栈来模拟递归。所以没有。

答案 1 :(得分:9)

您需要澄清您正在谈论的递归类型。有算法递归,实现中有递归。确实,任何递归算法都允许直接的非递归实现 - 可以通过使用模拟手动堆栈递归的标准技巧轻松实现。

但是,您的问题仅提及算法。如果假设它特别是关于算法递归,那么答案是,有些算法本身且不可避免地是递归的。在一般情况下,不可能用非递归算法替换固有递归算法。构建固有递归算法的最简单方法是首先采用固有的递归数据结构。例如,假设我们需要仅使用父对子链接遍历树(并且没有子对父链接)。不可能想出一个合理的非递归算法来解决这个问题。

所以,这就是你的一个例子:一个树的遍历,只有父对子链接,不能通过非递归算法来执行。

固有递归算法的另一个例子是众所周知的QuickSort算法。 QuickSort总是递归的,它不能简单地变成非递归算法,因为如果你成功完成它就不再是QuickSort了。这将是一个完全不同的算法。当然,这听起来像是一种纯语义的练习,但是这也值得一提。

答案 2 :(得分:1)

如果我正确地记住了我的算法,那么通过递归无法实现堆栈和循环。但是,我没有触手可及的正式证据。

编辑:我觉得答案可能是堆栈+循环无法通过递归实现的唯一事情是堆栈溢出吗?

答案 3 :(得分:1)

以下比较了递归与非递归实现:http://www.sparknotes.com/cs/recursion/whatisrecursion/section1.html

摘录:

鉴于递归通常效率较低,我们为什么要使用它?有两种情况,递归是最佳解决方案:

  1. 使用递归可以更清楚地解决问题:递归解决方案更清晰,更清晰,更容易理解。只要效率不是主要关注点,或者各种解决方案的效率是可比较的,那么您应该使用递归解决方案。
  2. 通过递归可以更容易地解决一些问题:有些问题没有简单的迭代解决方案。在这里你应该使用递归。河内塔问题是一个问题的例子,其中迭代解决方案将非常困难。我们将在本指南的后续部分中查看河内塔。

答案 4 :(得分:0)

您是否只是在寻找递归的实际示例?最近我的朋友和我实现了Haar Wavelet函数(作为开始学习Ruby的练习),这似乎需要递归。除非有人在没有递归的情况下执行它?

我想任何时候都不知道堆栈的深度是否正在迭代,递归是合乎逻辑的方法。当然,它可能适用于一些被黑客攻击的循环,但这是好的代码吗?