【发布时间】:2016-02-04 15:33:47
【问题描述】:
我想知道递归是否是问题的唯一解决方案,那么堆栈迭代是否是唯一的其他解决方案?我认为它们是等价的:如果递归有效,那么迭代肯定会有效,反之亦然。
另外,我不确定为什么递归被认为是低效的并且经常导致堆栈溢出,而使用堆栈的迭代不会。递归只是以用户不可见的自动方式使用堆栈。
【问题讨论】:
-
递归效率低下不是因为隐式堆栈,而是因为context switching 开销。它会导致堆栈溢出,因为分配给每个进程的堆栈空间量是有限的,并且远远小于分配给它的堆空间量。进程通常需要比堆栈空间更多的堆空间。因此,最好尽量避免使用堆栈。如果编译器执行tail call optimization,递归可以和迭代一样快。
-
当分配给进程的堆栈内存量(在进程创建时)用完时,就会发生堆栈溢出。每次扩展调用堆栈时(通常通过方法调用或在特殊情况下为递归调用),都会消耗它。
-
不一定是低效的,这取决于你使用哪种语言。看到这个问题stackoverflow.com/questions/2651112/…
-
@AaditMShah 虽然递归中不涉及上下文切换(除非这就是您所说的寄存器保存/恢复、堆栈框架设置和 IP 跳转,但是您的术语不寻常并且与您发布的链接不一致)。无论哪种情况,都不是昼夜差异。我测试了一个 7 节点缓存内二叉树的前序遍历:递归每个节点 3.6ns,显式堆栈每个节点 2.3ns。