我想知道递归函数与使用内存使用情况下使用堆栈之间的区别。 说大DFS哪个更有效率。递归函数与使用内存使用堆栈之间的区别
回答
一个明确的堆栈数据结构在理论上应使用略更少的内存,作为一个递归函数总是有每次调用一些额外的开销,返回地址等
我会假设你要讨论相同算法的两种方法之间的差异。我们有一个图G =(V,E)其中V是一组顶点并且E是一组顶点对,我们在图上通过以下任一方式运行深度优先搜索(DFS):
- 使用递归方法,其中
visit
方法递归调用自身。 - 在循环中使用显式堆栈。
这两种方法,对大的,使用相同的空间量,O(d)其中d是DFS搜索树的深度(它是由最长的可能的非循环路径为界在
图。通常一个明确的堆栈将使用少略内存保罗 - [R写入,另外重要的一点是,在许多语言中,函数调用栈是非常有限的,如果它的增长也将中止程序在堆中管理的显式堆栈并不构成类似的问题。为了获得略微虽然内存使用量较少,但您必须将堆栈表示为数组。如果你把它表示为一个链表,它可能不会更好。它甚至可能会稍微恶化。
我打算用另一种方式,至少在编译语言中。递归函数,以高效率编写,可以比明确的堆栈做得更好。编译器可以使用拥有它们的CPU的栈帧操作原语来更高效地执行操作。
这一观点得到支持“垃圾回收快,但堆栈更快”,由詹姆斯·小号米勒和Guillermo Rosaz:http://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.18.2789
我认为你的意思是在时间方面的效率。我用记忆的方式问 – ashmish2 2011-02-28 17:28:09
- 1. 数组和堆栈之间的区别?
- 2. 在递归函数中存储堆栈
- 3. 我在使用的std ::堆栈以递归函数检索值
- 4. 如何将递归函数转换为使用堆栈?
- 5. 非递归析构函数二叉搜索树使用堆栈
- 6. 使用递归溢出堆栈
- 7. 即使递归调用在函数结束时堆栈级别太深?
- 8. 堆栈上的递归函数
- 9. 使用堆栈的河内Python解决方案的递归塔
- 10. 递归函数堆栈溢出
- 11. 堆中的对象与堆栈内存之间的混淆
- 12. 使用递归函数堆栈 - 在Scala中使用Free Monads Trampoline安全吗?
- 13. 回溯和递归之间的区别?
- 14. 如何跟踪递归函数的调用堆栈使用情况
- 15. 递归Java - 堆栈
- 16. .NET EXE和DLL之间的堆栈/堆区别
- 17. 递归时堆栈级别太深(SystemStackError)
- 18. jQuery递归函数调用和Javascript的setInterval之间有区别吗?
- 19. Lisp中递归函数调用的堆栈溢出
- 20. 由递归函数占用的堆栈大小维
- 21. 关于堆栈和堆栈内存使用的问题
- 22. 进程虚拟内存 - 堆栈和堆之间的空间
- 23. 堆栈和堆之间有什么区别?
- 24. 使用Javascript类函数执行15次递归后的堆栈溢出
- 25. 函数与递归导致堆栈溢出
- 26. 将递归函数中的setTimeOut函数导致堆栈溢出?
- 27. 使用可选参数F#重载函数之间的区别
- 28. 堆栈缺少递归调用Java的
- 29. Wicket,页面堆栈和内存使用
- 30. PHP - 使用和不使用内存方法的对象之间的区别?
编译器将您的递归程序转换成一个迭代,从而创造一个明确的堆栈:) – 2011-03-01 08:11:59