这是过去的试卷中的一个问题。
当循环测试显示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;
}
答案 0 :(得分:1)
循环不变量是在循环的每次迭代期间必须为真的条件。在此示例中,我们正在考虑变量i
的可能值。当循环开始时,i
的值为0.在循环的最后一次迭代中,i
在循环开始时递增到n
,然后完成另一次计算。因此,i
的值在执行此循环期间满足条件0<=i<=n
。
答案 1 :(得分:1)
因为当循环离开时Post-Condition
为i==n
。进入循环时Pre-Condition
为i==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<i
不会在第一次迭代结束时保持。