【问题标题】:DFS Recursive vs DFS Iterative [duplicate]DFS递归与DFS迭代[重复]
【发布时间】:2015-01-17 22:48:16
【问题描述】:

我试图了解 DFS 递归和 DFS 迭代之间的区别。有栈的那个是使用迭代还是递归的方法?

例如,使用图的 DFS 递归遍历和图的 DFS 迭代遍历会产生什么输出?邻居按字母顺序迭代。

图表如下:

对于 DFS 遍历(带有堆栈的遍历,不确定它是递归还是迭代),这是我得到的:A、C、D、E、F。有人可以确认这是什么类型的 DFS 遍历,并且另一个将如何工作?谢谢!

【问题讨论】:

标签: algorithm recursion depth-first-search


【解决方案1】:

据我了解,递归和迭代版本的区别仅在于堆栈的使用。递归版本使用调用堆栈,而迭代版本执行完全相同的步骤,但使用用户定义的堆栈而不是调用堆栈。步骤顺序本身没有区别(如果使用合适的打破平局规则来确保子节点的遍历顺序相同 - 如果需要),因此无法检查输出以确定是否使用了迭代或递归实现.

【讨论】:

  • 这并不完全正确。递归和迭代方法的输出存在差异。详情见Iterative DFS vs Recursive DFS and different elements order
  • 嗯,你是对的,但是正如链接问题中提到的,本质上没有指定遍历子项的顺序;必须定义一些额外的顺序。我会稍微改变一下答案。
【解决方案2】:

如另一个答案所示,使用 DFS 遍历您的图将以相同的方式访问顶点,而不管实际的 DFS 实现如何,使用迭代或递归。请参阅Wikipedia article 上的伪代码。

您还有一个额外要求,即按字母顺序访问相邻顶点。这意味着在向堆栈推送东西时必须对堆栈进行排序(在迭代版本中),或者这意味着您必须按排序顺序递归相邻顶点(在递归版本中)。两种实现的行为完全相同。

鉴于字母顺序约束,结果 A、C、D、E、F 是图唯一可能的 DFS 遍历。

【讨论】:

    猜你喜欢
    • 2015-02-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多