我正在尝试找到循环的不变量(例如,在以下代码中) 我真的不知道如何找到一般的不变量。 任何人都可以帮我找到一个不变量,并帮助我找到以下代码? 感谢
public static int div(int a, int b)
{
int q = 0;
while(a >= b)
{
a -= b;
q++;
}
return q;
}
答案 0 :(得分:4)
关于循环不变量的首要注意事项是它们有很多。其中一些更有用,而另一些则不太有用。由于不变量用于证明程序的正确性,因此选择不变量取决于您要证明的内容。
例如,q >= 0
是循环的不变量。如果要证明函数返回正数,这就是您所需要的。如果你想证明一些更复杂的东西,你需要一个不同的不变量。
由于Java中的参数是按值传递的,并且由于程序修改了参数a
的值,因此我们使用a0
来表示a
参数的初始值。现在您可以编写以下不变表达式:
a == a0 - (b * q)
通过观察每次q
增加a
时,b
也减少了a0
,从而得出这个不变量。因此,b
在循环的每次迭代中都会q
完全减少q == a0 / b
次。
此不变量可用于证明循环产生a
,并且a0 % b
的结束值等于{{1}}。
答案 1 :(得分:1)
循环不变量是一种条件,对于循环的每次迭代都适用。
在你的循环中,谓词q >= 0
是一个循环不变量,因为它始终是真的。分析循环不变量的需求是,当您从循环中退出时,可以保证循环不变量和循环终止条件。因此,在退出循环时,我们可以确定q >= 0
和a < b
。
答案 2 :(得分:0)
循环不变量是一个条件,它为循环的每次迭代保存 true 。
在你的情况下,一个不变量是:
q&gt; = 0