递归和DFS是否相同?

时间:2016-02-13 22:27:09

标签: algorithm recursion graph-theory depth-first-search

我想知道是否可以将任何递归算法实现重新定义为DFS图遍历。

2 个答案:

答案 0 :(得分:2)

我认为你可以考虑将很多递归算法作为DFS。问题是,您认为DFS运行的图表是什么。

例如,如果您再次出现类型

f(n1,...,nk)=G(f(n1',...nk'), f(n1'',...,nk''),...)

图表应该是什么?如果您将配置(n1,...,nk)理解为图表的顶点,并将配置(n1,...nk)与配置(n1',...,nk')(n1'',..., nk'')...的相关性表示为有向边在这些顶点之间,这个图表上的重复计算和DFS计算是等效的。

例如,对于Fibonacci数f(n)=f(n-1)+f(n-2)f(n)仅取决于一个参数(因此我为nn1)。操作G将是总和:G(f(n-1), f(n-2)):=f(n-1)+f(n-2)

在新兴的抽象图中,顶点为{0,1,2,3,4,...},边将为{(2,0), (2,1), (3,1), (3,2), ...}

DFS使用memoization并仅计算一次配置的值。每次复发都不是这样(经典的例子是Fibonacci数的天真实现),但是每次重复都可以扩展到使用memoization。

至于萨尔瓦多的反例,如果我们将函数A的参数理解为一个顶点(尽管被称为"图形"!),那么A可以被视为DFS(非常无聊,因为每个节点只有一个传出边缘,即使是随机的)。

我知道,我的答案不是证据,但我希望你能理解为什么可以将复发视为DFS。

答案 1 :(得分:1)

不,这是一个您无法找到DFS遍历的算法。

func A(graph):
   if graph is empty:
       stop
   print random vertex from a graph
   func A(grap without this vertex)

这显然是图上的一些递归算法。尝试找到一个类似的DFS。