4

这是过去试卷中的一道题。

为什么i<=n循环测试说循环不变量说i<n

是一个合适的答案:它说i<=nas iwill equaln在 while 循环的失败条件下。因此,第 6 次迭代i将等于n失败条件下的值 6。但是,while 循环本身状态i<ni从 0 开始,并且将完成循环一次i等于 5。

private int n =6;

public int fact(){
    int i = 0;
    int f = 1;

    /**loop invariant
     * 0<=i<=n
     * f=i!
     */
    while(i<n){//loop test
        i=i+1;
        f=f*i;
    }

    return f;
}
4

3 回答 3

1

循环不变量是在循环的每次迭代期间必须为真的条件。在这个例子中,我们正在考虑变量的可能值是什么i。循环开始时, 的值为i0。在循环的最后一次迭代中,i递增到n循环开始时,然后进行另一次计算。因此, 的值在此循环执行期间i满足条件。0<=i<=n

于 2012-08-29T22:25:56.933 回答
1

因为Post-Conditioni==n离开循环的时候。Pre-Condition进入循环时是i==0. 循环内部i正在向 计数n。所以不变量是0 <= i <= n

我在解释中省略了不变的部分f。这还不够,因为不变量必须捕获循环的正确性和含义。

private int n = 6;

public int fact(){
    int i = 0;
    int f = 1;

    /* loop invariant: 0 <= i <= n && f == i! */
    /* PRE: i == 0 && f == i! */
    while (i < n) {
        i = i + 1;
        f = f * i;
    }
    /* POST: i == n && f == i! */

    return f;
}
于 2012-08-29T22:35:57.973 回答
0

在循环的最后一次迭代中,i从 5 开始,然后增加到 6。i<n在最后一次迭代完成后不会保持。请记住,循环不变量必须在每次迭代的开头(条件)和结尾(最后一条语句之后)都成立。

另请注意,它必须是 0 <= i<=n 而不是 0 < i<=n,因为0<i在第一次迭代结束时不会成立。

于 2012-08-29T22:34:45.040 回答