证明递归算法

时间:2015-06-05 07:23:42

标签: algorithm recursion proof

我需要证明一个递归算法。通常这可以使用代码中的一些整数值作为感应的基本情况来完成,就像计算阶乘但是使用图遍历时我不知道从哪里开始。这是我的算法。下标没有转换。

算法

目标:遍历创建深度优先生成树的图表,并计算每个顶点的最后一个后代,该顶点是具有最高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
}

这是针对学校的小组项目,所以我不想要整个校对,但我们非常感谢你的出发点和一些方向。

1 个答案:

答案 0 :(得分:0)

我很难理解你的伪代码。似乎不清楚,可能算法甚至不起作用。一些问题:

  • "访问过"属性已设置,但从未使用过。
  • T应该是一棵树。但是你只能添加顶点,没有边缘。没有边缘,它肯定不是生成树。如果你考虑T中T部分节点之间原始图形的所有边缘,那么它将包含周期并且不会成为树。
  • 为什么要计算lk,如果它从未使用过?
  • 你的函数dfs的参数应该是k而不是vk吗?否则k永远不会被设置,但它正被使用。
  • 我没看到你的递归如何终止。我没有看到任何针对基本案例的警卫(除了可能是" k值最低"你的循环中的条件 - 我不明白,因为我理解其余的代码,k是函数的输入参数,因此m不依赖于它。)

所以,让我告诉你关于通常在图上证明递归算法的问题。除了你提到的对自然数的归纳之外,还有Structural Induction。它有一个基础案例和一个归纳步骤,就像你知道的归纳法一样。但基本情况通常是数据结构的一个微不足道的组成部分,归纳步骤证明了您对更复杂的复合材料的命题,假设您的命题适用于其较不复杂的组件。

例如,假设您的算法适用于左侧和右侧子树,您可以通过证明它适用于树叶(您的基本情况)并证明它适用于整个树,来证明树上的算法根(诱导步骤)。

由于除了上面的树示例之外,您的图形可能包含循环,因此不能自动保证传递给递归调用的数据结构不如原始数据结构复杂。但是你的算法可能有一些方法可以确保递归调用只考虑图的一部分,可能是通过"访问过的"旗。在这种情况下,递归调用只需考虑"未访问"子。所以你可以诱导那些未经访问过的子图。从基础案例开始,只有一个顶点未被访问。然后将一个未访问的节点(包括其边缘)归纳为未访问的子图。