什么结构可以迭代地模拟递归

时间:2012-12-01 06:05:04

标签: language-agnostic

我认为它会是一个堆栈,但它可能是跳过列表,bst或队列吗?

它是一个堆栈是有道理的,因为我们可以继续推动它并弹出。但是队列会更好,因为它按照它们的顺序添加它们吗?

1 个答案:

答案 0 :(得分:0)

你自己基本上只回答了一个问题:使用堆栈是有意义的,因为如果使用递归,你可以按照与编译器相同的顺序推送和弹出堆栈。以人们期望它们发生的方式做事是件好事(即使你可以以不同方式做到这一点)。

堆栈也是问题和容量最小的容器的最简单的解决方案,并且这些元素按递归时通常需要的顺序排出,而不需要做任何特殊的事情。

相比之下,队列有更多的复杂性,因为它有头和尾,而内存管理更复杂(堆栈基本上只是一块内存和一个递增/递减的指针)。

此外,当使用队列时,元素按照您推入它们的顺序出现。这可能与某些问题无关(例如,如果您只想迭代每个元素一次并且不关心顺序),但是它使回溯变得不必要地复杂化。例如,当递归细分数据块或递归地走树时,你将首先递归到左半部分,然后进入左半部分,依此类推。
当你达到最大深度时,你会想要回溯一个级别并递归到右半部分(并且回溯到另一个级别,依此类推)。使用堆栈,这可以通过简单的 pop 来完成。使用队列,您必须明确记住要去哪里。这当然不是不可能的,但这并不是微不足道的。

您还提到了跳过列表。请注意,跳过列表并不是一个简单的“列表”,而是一个相当复杂的结构,与搜索树相当。它也不是问题的“自然选择”,并且由于它的复杂性最明确地不是你想要用于递归的东西(尽管如果一个人足够顽固,它可能会被用来)。

相关问题