我正在学习数据结构&算法现在。
我的讲义有一个二叉搜索树的实现,它使用递归方法实现。这是一种优雅的方式,但我的问题是在现实生活中的代码中,如果我递归地实现二进制搜索树,如果树具有较大的高度/深度数,它是否会生成大量的调用堆栈。
我理解递归是理解大量数据结构概念的关键概念,但是你会选择在现实代码中使用递归吗?
答案 0 :(得分:4)
树本质上是递归的。树的每个节点代表一个子树,每个注释的每个子节点代表该子树的子树,因此递归是最好的选择,特别是在其他人可能需要编辑和维护代码的实践中。
现在,IF深度成为你的调用堆栈的一个问题,而不是我担心你的数据结构存在更深层次的问题(无论是巨大的,还是非常不平衡的)
答案 1 :(得分:2)
很多时候,编译器可以优化您的代码,以避免为每个递归调用创建一个新的堆栈帧(例如,查找尾递归)。当然,这一切都取决于算法和数据结构。如果树是合理平衡的,我不认为递归算法会导致任何问题。
答案 2 :(得分:2)
“我理解递归是了解很多东西的关键概念 数据结构,但你会选择在现实生活中使用递归 码?“
在第一次了解递归之后,我也有同感。但是,我已经在软件行业工作了一年多,我可以说我已经使用了递归的概念来解决几个问题。通常情况下,递归更清晰,更容易理解/阅读,而且更好。为了强调前面答案中的一点,树是递归数据结构。 IMO,没有其他方法可以遍历BST:)
答案 3 :(得分:0)
这是正确的,递归是直觉和优雅的,它产生的代码清晰简洁。它也是正确的,一些方法,如快速排序,DFS等,实际上很难迭代实现。 但实际上,与迭代对应物相比,递归实现几乎总是会变慢,因为所有函数调用(为了真正理解性能命中,我建议你了解一下,为单个函数调用,汇编程序必须要做多少书籍保存)。
我们讨论的优化一般不适用于每个递归方法,而manny编译器和解释器甚至不支持它们。总结一下,如果你正在写一些性能至关重要的东西,比如数据结构,那就远离递归(或者如果你确定你的编译器/解释器让你得到覆盖就使用它)
PS:CLRS(算法简介,第290页,最后一行)表明,与递归算法相比,BST的迭代搜索过程更快。