我想知道是否可以将任何递归算法实现重新定义为DFS图遍历。
答案 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)
仅取决于一个参数(因此我为n
写n1
)。操作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。