正确的循环不变?

时间:2013-11-10 18:23:44

标签: loop-invariant

我试图在以下代码中找到循环不变量:

找到最近的一对(A):

# Precondition: A is a non-empty list of 2D points and len(A) > 1. 

# Postcondition: Returns a pair of points which are the two closest points in A.
    min = infinity
    p = -1
    q = -1
    for i = 0,...,len(A) - 1:`=
        for j = i + 1,...,len(A) - 1:
             if Distance(A[i],A[j]) < min:
                 min = Distance(A[i],A[j])
                 p = i
                 q = j
    return (A[p],A[q])

我认为循环不变量是min = Distance(A [i],A [j]),所以A中的最近点是A [p]和[q]。 我试图表明程序的正确性。在这里,我想通过让我成为一个常数来证明内部循环,然后一旦我证明了内部循环,用它的循环不变量替换它并证明外部循环。顺便说一下这是功课。任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:0)

我不确定通过循环不变来替换内循环我完全理解你的意思。循环不变量是在循环之前和循环的每次迭代之后(包括最后一个循环)保持的条件 话虽如此,我不想破坏你的作业,所以我会尽力帮助你,而不会给你太多的答案。让我试试:

您的算法中有三个变量包含非常重要的值(minpq)。您应该问自己这些值的真实情况,因为算法遍历每对点(A[i], A[j])

在一个更简单的示例中:如果您正在设计一个算法来对列表中的值求和,您可以在循环之前创建一个名为sum的变量,并为其指定 0 。然后,您将通过循环逐个对元素求和,然后返回变量sum 因为这个变量确实存在循环中“看到”的每个元素的总和,并且因为在主循环之后算法将“看到”列表中的每个元素,sum变量必然保持列表中所有值的总和。在这种情况下,循环不变量将是: sum变量保存到目前为止“看到”的每个元素的总和

祝你的作业好运!