Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 是否需要在循环之前和之后定义循环不变量?_Algorithm_Loops_Code Analysis - Fatal编程技术网

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