例如:
int sum = 0;
for (int = 0; i < 10; i++) {
sum += i
}
不变量将是和等于0 + 1 + 2 + ... + i。你可以说在第二次迭代结束时i = 1,sum = 1.这样可行,但是不变量也需要在迭代开始时有效 - 而事实并非如此。循环开始之前Sum为0,违反了该不变量。这是对的吗?
答案 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)
循环不变量不属于整个循环,而是属于循环中的一个特定点。你会写一个循环不变量,在增加总和之前就是真的,一个在增加总和之后就是真的,一个就在增加之后。
当您浏览循环语句时,您将获得不同的不变量。循环结束时,当您重新进入循环时,循环结束时应该导致循环开始时的那个正确。