我不确定,但我听说过只能通过递归实现的算法。有人知道这样的事情吗?有什么只能通过递归来实现吗?
回答
您需要澄清您正在讨论的递归类型。有算法递归,并且在实现有递归。确实,任何递归的算法都允许简单的非递归实现 - 人们可以通过使用手动堆栈模拟递归的标准技巧来轻松实现。
但是,您的问题仅提供算法。如果我们假定它具体是关于算法递归,那么答案是是,这里有一些固有的和不可避免的递归算法。在一般情况下,不可能用非递归算法替换固有递归算法。构建固有递归算法的最简单方法是首先采用固有递归的数据结构。例如,假设我们需要遍历一棵只有父 - 子链接的树(并且没有子 - 父链接)。想出一个合理的非递归算法来解决这个问题是不可能的。
所以,这就是你的一个例子:只有父 - 子链接的树的遍历不能由非递归算法执行。
固有递归算法的另一个例子是众所周知的QuickSort算法。 QuickSort始终是递归的,并且它不能简单地转化为非递归算法,因为如果您成功完成此操作,它将不再是QuickSort。这将是一个完全不同的算法。当然,这听起来像纯粹的语义练习,但是这也是值得一提的。
你能解释一下“算法递归”是什么意思吗?我从来没有听说过。关于你的快速评论:你是说“常用”(恒定空间)实现不是快速排序,还是算法递归,即使它不是实际递归? – sepp2k 2010-08-11 08:55:58
*算法递归*(或*递归算法*)我的意思是基于以下原理构建的算法:1)使用分而治之(D&C)方法,即通过将问题分解为更小的子区域来解决问题, 2)D&C方法产生的子问题以LIFO顺序解决,即子问题等待轮到他们解决在堆栈状结构中。如果无法通过常数限制该LIFO数据结构的大小,那么该算法本质上是真正的*递归*。 – AnT 2010-08-11 16:28:55
此外,我不知道这样的东西作为恒定空间QuickSort。 QuickSort的智能实现需要'O(log n)'空间。如果我们引入平台限制(比如给定平台上最大数组的大小),我们当然可以用相对较小的常量来限制空间,但这与算法本身没什么关系。 QuickSort仍然(并始终)递归。另外还有深度优先搜索。 – AnT 2010-08-11 16:31:26
如果我正确地记住了我的算法,那么递归无法通过堆栈和循环完成任何操作。然而,我手边没有这方面的正式证据。
编辑:它发生在我身上,答案可能是唯一可以通过递归实现的,不能用堆栈+循环实现的,是堆栈溢出?
下比较递归与非递归实现:http://www.sparknotes.com/cs/recursion/whatisrecursion/section1.html
摘录:
鉴于递归总体效率较低,我们为什么要使用它?有两种情况下递归是最好的解决办法:
- 的问题是使用递归更清楚解决:有很多问题,其中递归解决方案更清晰,更清洁和更易懂。只要效率不是主要问题,或者各种解决方案的效率是可比较的,那么您应该使用递归解决方案。
- 通过递归解决一些问题更容易:有一些问题没有简单的迭代解决方案。在这里你应该使用递归。河内问题塔是一个迭代解决方案非常困难的例子。我们会在本指南后面的章节中看看河内的塔楼。
你只是在寻找一个递归的实例吗?最近我的朋友和我实现了Haar Wavelet函数(作为开始学习Ruby的练习),这似乎需要递归。除非任何人没有递归实现它?
我会想象任何时候一个人不知道堆栈的深度正在迭代,递归是合乎逻辑的路径。当然,它可能适用于一些被破解的循环,但那是好代码吗?
- 1. 这个结果可以通过递归cte来实现吗?
- 2. 为什么swap()有时通过传递数组来实现?
- 3. 有没有什么只能通过ApplicationContext实现,而ActivityContext只能实现,反之亦然?
- 4. 最好的做法是通过局部实现递归吗?
- 5. 递归有什么用处吗?
- 6. 有什么方法可以通过scikit-learn来实现skip gram吗?
- 7. 我的递归实现有什么问题?
- 8. 如何通过ajax传递值来实现功能
- 9. 通过递归
- 10. 在`async`中实现了一个非递归功能吗?
- 11. 通过递归来反转节点
- 12. 如何通过递归实现未知层的嵌套循环?
- 13. 什么是通过调用_mm_stream_si64x()来实现性能增益的示例程序?
- 14. 有人可以改进Java中indexOf的递归实现吗?
- 15. 例子只能是递归
- 16. 递归和类实例递归的区别是什么
- 17. C++ - 递归结构 - 有可能吗?
- 18. 可能有相互递归类吗?
- 19. 为什么不将OCaml List.fold_right作为尾递归实现?
- 20. 为什么使用std :: tuple实现的递归继承不好?
- 21. 如何实现递归
- 22. 方法的递归实现
- 23. antlr4 - 如何实现递归
- 24. 如何实现递归deftype
- 25. 递归DataTemplates可能吗?
- 26. 为什么不能递归地工作?
- 27. 为什么我不能传递变量来实现交换功能?
- 28. 只有Chmod递归目录?
- 29. 为什么在方案的所有实现中都需要尾递归?
- 30. 在java中这种方法有什么问题?我想实现递归
看看http://stackoverflow.com/questions/1011448/necessary-uses-of-recursion-in-imperative-languages – 2010-08-10 17:03:25
你应该看看下面的问题:http://stackoverflow.com/questions/3451439/is-there-anything-which-can-only-be-by-recursion – 2010-08-10 17:19:29
在命令式语言中? – 2010-08-10 17:22:35