Algorithm 是否需要在循环之前和之后定义循环不变量?
到目前为止,我对循环不变量及其特定属性感到非常困惑。它们是否需要在循环前后都为真?或者只是在循环体本身的某个点上 例如:Algorithm 是否需要在循环之前和之后定义循环不变量?,algorithm,loops,code-analysis,Algorithm,Loops,Code Analysis,到目前为止,我对循环不变量及其特定属性感到非常困惑。它们是否需要在循环前后都为真?或者只是在循环体本身的某个点上 例如: int sum = 0; for (int = 0; i < 10; i++) { sum += i } int和=0; 对于(int=0;i
int sum = 0;
for (int = 0; i < 10; i++) {
sum += i
}
int和=0;
对于(int=0;i<10;i++){
总和+=i
}
不变量是和等于0+1+2+…+我你可以说在第二次迭代结束时,i=1,sum=1。这是可行的,但不变量也需要在迭代开始时有效——事实并非如此。循环开始前,Sum为0,违反了该不变量。正确吗?循环不变量不属于整个循环,而是属于循环中的一个特定点。你可以写一个循环不变量,它在和增加之前为真,在和增加之后为真,在i增加之后为真
在遍历循环语句时,会得到不同的不变量。然后,当您重新进入循环时,循环末尾的一个应导致循环开头的一个正确 是的,循环不变量需要在循环前后定义并为true 下面是完全带注释的代码。为了清晰起见,我们将for的
循环改为while
。我们定义了一个空和(i-1sum==0+1+…9)
如您所见,循环不变量是sum==0+1+…i-1
。它(通常)在循环之前建立,在循环中修改然后恢复,在循环之后为true。再加上循环退出条件(i==10
),它确保了正确性(sum==45
)。对什么sum
“需要”。它根本不影响循环。循环的条件仅为i您的不变量为sum==(0如果i否,则循环不变量是唯一定义的,在任何迭代之前和之后都保持为真(如果根本没有迭代,它也必须保持)。在循环中的某些位置保持为真的其他条件也是不变量,但它们不用于证明循环的效果,也不会被称为循环不变量。
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