是否需要在循环之前和之后定义循环不变量?

时间:2015-02-05 08:21:20

标签: algorithm loops code-analysis

到目前为止,关于循环不变量及其特定属性,我一直很困惑。他们是否需要在循环之前和之后都是真的?或者只是在循环体本身的某个点?

例如:

int sum = 0;
for (int = 0; i < 10; i++) {
    sum += i
}

不变量将是和等于0 + 1 + 2 + ... + i。你可以说在第二次迭代结束时i = 1,sum = 1.这样可行,但是不变量也需要在迭代开始时有效 - 而事实并非如此。循环开始之前Sum为0,违反了该不变量。这是对的吗?

2 个答案:

答案 0 :(得分:2)

是的,循环不变量需要在循环之前和之后定义并且为真。

这是完全注释的代码。为清楚起见,我们已将for循环变为while。我们将空值(i-1<0)定义为0

int sum = 0;
// sum == 0
int i= 0;
// Loop invariant: sum == 0 + 1 + ... i-1
while (i < 10) {
    // Loop invariant: sum == 0 + 1 + ... i-1
    sum += i;
    // sum == 0 + 1 + ... i
    i++;
    // Loop invariant: sum == 0 + 1 + ... i-1
}
// Loop invariant: sum == 0 + 1 + ... i-1, and i == 10 => sum == 0 + 1 + ... 9

如您所见,循环不变量为sum == 0 + 1 + ... i-1。它(通常)在循环之前建立,修改然后在循环中恢复,并且在循环之后为真。与循环退出条件(i == 10)一起,它确保正确性(sum == 45)。

答案 1 :(得分:0)

循环不变量不属于整个循环,而是属于循环中的一个特定点。你会写一个循环不变量,在增加总和之前就是真的,一个在增加总和之后就是真的,一个就在增加之后。

当您浏览循环语句时,您将获得不同的不变量。循环结束时,当您重新进入循环时,循环结束时应该导致循环开始时的那个正确。