我不确定,但我听说过只能通过递归实现的算法。有谁知道这件事吗?
答案 0 :(得分:18)
您可以通过保留自己的堆栈来模拟递归。所以没有。
答案 1 :(得分:9)
您需要澄清您正在谈论的递归类型。有算法递归,实现中有递归。确实,任何递归算法都允许直接的非递归实现 - 可以通过使用模拟手动堆栈递归的标准技巧轻松实现。
但是,您的问题仅提及算法。如果假设它特别是关于算法递归,那么答案是是,有些算法本身且不可避免地是递归的。在一般情况下,不可能用非递归算法替换固有递归算法。构建固有递归算法的最简单方法是首先采用固有的递归数据结构。例如,假设我们需要仅使用父对子链接遍历树(并且没有子对父链接)。不可能想出一个合理的非递归算法来解决这个问题。
所以,这就是你的一个例子:一个树的遍历,只有父对子链接,不能通过非递归算法来执行。
固有递归算法的另一个例子是众所周知的QuickSort算法。 QuickSort总是递归的,它不能简单地变成非递归算法,因为如果你成功完成它就不再是QuickSort了。这将是一个完全不同的算法。当然,这听起来像是一种纯语义的练习,但是这也值得一提。
答案 2 :(得分:1)
如果我正确地记住了我的算法,那么通过递归无法实现堆栈和循环。但是,我没有触手可及的正式证据。
编辑:我觉得答案可能是堆栈+循环无法通过递归实现的唯一事情是堆栈溢出吗?
答案 3 :(得分:1)
以下比较了递归与非递归实现:http://www.sparknotes.com/cs/recursion/whatisrecursion/section1.html
摘录:
鉴于递归通常效率较低,我们为什么要使用它?有两种情况,递归是最佳解决方案:
答案 4 :(得分:0)
您是否只是在寻找递归的实际示例?最近我的朋友和我实现了Haar Wavelet函数(作为开始学习Ruby的练习),这似乎需要递归。除非有人在没有递归的情况下执行它?
我想任何时候都不知道堆栈的深度是否正在迭代,递归是合乎逻辑的方法。当然,它可能适用于一些被黑客攻击的循环,但这是好的代码吗?