我需要证明一个递归算法。通常这可以使用代码中的一些整数值作为感应的基本情况来完成,就像计算阶乘但是使用图遍历时我不知道从哪里开始。这是我的算法。下标没有转换。
算法
目标:遍历创建深度优先生成树的图表,并计算每个顶点的最后一个后代,该顶点是具有最高k值的后代vk
输入:
A connected graph G with vertices ordered v1, v2, v3 … vn
输出:
A spanning tree T where each vertex in T has had its Last vertex computed
初始化 将每个顶点设置为未访问。设ak表示与vk相邻的所有顶点的列表。让lk表示vk的最后一个后代。设ck表示生成树中vk的所有子节点的列表。设dk表示生成树中包含vk的vk后代的所有顶点的列表。
dfs(vk){
add vK to T
set v to visited
lk = vk
add vk to dk
foreach(vertex m in ak with lowest value of k){
add m to ck
add dfs(m) to dk
}
foreach(vertex vc in dk){
if( c > k){
lk = vc
}
}
if(k = 1)
return T
else
return dk
}
这是针对学校的小组项目,所以我不想要整个校对,但我们非常感谢你的出发点和一些方向。
答案 0 :(得分:0)
我很难理解你的伪代码。似乎不清楚,可能算法甚至不起作用。一些问题:
所以,让我告诉你关于通常在图上证明递归算法的问题。除了你提到的对自然数的归纳之外,还有Structural Induction。它有一个基础案例和一个归纳步骤,就像你知道的归纳法一样。但基本情况通常是数据结构的一个微不足道的组成部分,归纳步骤证明了您对更复杂的复合材料的命题,假设您的命题适用于其较不复杂的组件。
例如,假设您的算法适用于左侧和右侧子树,您可以通过证明它适用于树叶(您的基本情况)并证明它适用于整个树,来证明树上的算法根(诱导步骤)。
由于除了上面的树示例之外,您的图形可能包含循环,因此不能自动保证传递给递归调用的数据结构不如原始数据结构复杂。但是你的算法可能有一些方法可以确保递归调用只考虑图的一部分,可能是通过"访问过的"旗。在这种情况下,递归调用只需考虑"未访问"子。所以你可以诱导那些未经访问过的子图。从基础案例开始,只有一个顶点未被访问。然后将一个未访问的节点(包括其边缘)归纳为未访问的子图。