理解循环不变量

时间:2012-09-28 04:01:00

标签: c++ loops assert

一位大学新生我知道参加计算机科学课程,请他帮我完成一项家庭作业。我读了几遍,我很尴尬地承认我不知道他们要求什么。这是问题:

以下是循环的概要。完成程序,使其读入x和y值,验证它们(通过继续提示用户,直到它们输入正确的值),并运行以使给定的断言始终为true。在程序中的四个点包含循环不变断言,它必须为真。除了给定的assert(...)语句之外,您不能使用乘法运算符。

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

我不知道循环不变是什么,所以我用Google搜索并阅读Wikipedia article。从那里我收集第一个断言声明告诉我,我不应该允许x和y在循环的持续时间内为负。说实话,我陷入了困境。有人能帮我理解他们在这里要求的东西吗?

1 个答案:

答案 0 :(得分:1)

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

然而,人们可以推断它是关于让用户输入两个正整数,并且在不使用乘法运算符的情况下计算产品,作为总和。

通常,正整数的乘积可以用这种方式定义为总和:

  

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

通过要求保留一般规则来推断操作数1和0的情况。

最后一个等式与你所显示的断言的相似性可能不是巧合。

无论如何,它作为循环不变量很好地工作。当你增加循环变量时,循环不变量仍然存在,并确保你有一个很好的产品。因此,当循环结束时,循环不变量对该产品的约束,加上此时循环变量的值,可确保您拥有一个(很容易缩减为)x * y的产品。