了解循环不变量

Understanding loop invariants

本文关键字:不变量 循环 了解      更新时间:2023-10-16

我认识的一位正在上计算机科学课的大一新生在他的一项家庭作业上向我寻求帮助。我通读了几遍,不好意思承认我不知道他们在问什么。问题是:

下面给出了一个循环的轮廓。完成程序,使其读取x和y值,验证它们(通过继续提示用户,直到他们输入正确的值),并运行,使给定的断言始终为true。在程序中必须为true的四个点上包含循环不变断言。除非在给定的assert(…)语句中,否则不能使用乘法运算符。

assert(x>0 && y>0);
while(...)
{
assert(sum == i*(x+1));
...
...
}
assert(sum == y*(x+1));

我不知道循环不变量是什么,所以我在谷歌上搜索并阅读了维基百科的文章。从中我收集到第一个断言语句告诉我,在循环的持续时间内,我不应该允许x和y为负数。说实话,我陷入了困境。有人能帮我理解他们在这里要求什么吗?

对家庭作业的描述不完整,几乎毫无意义。

然而,可以推断这是关于让用户输入两个正整数,并在不使用乘法运算符的情况下将乘积计算为和。

通常,正整数的乘积可以这样定义为和:

2次b=b+b
(a+1)次b=b+(a次b)

通过要求保持通用规则来推断操作数1和0的大小写。

最后一个方程与你所展示的断言的相似性可能不是巧合。

无论如何,它作为循环不变量工作得很好。当你增加循环变量时,循环不变量仍然保持不变,并确保你有一个好的产品。因此,当循环结束时,循环不变量对该乘积的约束,加上循环变量在这一点上的值,确保了你有一个乘积(很容易简化为)x*y。