解释循环不变量

时间:2012-08-29 22:20:05

标签: java loop-invariant

这是过去的试卷中的一个问题。

当循环测试显示i<=n时,为什么循环不变量会显示i<n

是一个恰当的答案:它表示i<=n i在{while}循环的失败条件下等于n。因此,i的第6次迭代将等于失败条件下的n值6。但是,while循环本身会将i<n表示为i从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;
}

3 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:1)

因为当循环离开时Post-Conditioni==n。进入循环时Pre-Conditioni==0。循环内部i正在计算n。所以不变量是0 <= i <= n

我在我的exlanation中省略了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;
}

答案 2 :(得分:0)

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

还要注意它必须是0 &lt; = i&lt; = 而不是0 &lt; i&lt; = n,因为0<i不会在第一次迭代结束时保持。