【问题标题】:Understanding loop invariants了解循环不变量
【发布时间】:2012-09-19 22:44:26
【问题描述】:

我认识的一位大学新生正在学习计算机科学课程的介绍,他要求我帮助他完成一项家庭作业。我通读了几次,我很尴尬地承认我不知道他们要什么。问题来了:

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

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

我不知道什么是循环不变量,所以我用谷歌搜索并阅读了Wikipedia article。从那我收集到的第一个断言语句告诉我,在循环期间我不应该允许 x 和 y 为负数。老实说,我被困在这一点上。有人可以帮我理解他们在这里的要求吗?

【问题讨论】:

  • 我猜我是循环变量? x 和 y 的一次读取必须在循环之前。或者是否有 x 和 y 的起始值?总和有初始值吗?
  • 如果任何asserts 评估为假,您的程序将无法运行。将i 作为每次循环执行时都会改变的变量。
  • 你可能想参考这个帖子...stackoverflow.com/q/3221577/1410711
  • @ChaosCakeCoder 你知道我所知道的关于这个问题的一切。

标签: c++ loops assert


【解决方案1】:

作业的描述不完整,几乎没有意义。

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

一般来说,正整数的乘积可以这样定义为和:

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

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

最后一个等式与您展示的断言相似,可能不是巧合。

无论如何,它作为循环不变量工作得很好。当你增加循环变量时,循环不变量仍然成立,并确保你有一个好的产品。这样当循环结束时,循环不变量对该乘积的约束,加上此时循环变量的值,确保您有一个乘积(很容易减少到)x*y。

【讨论】:

  • 感谢您的帮助。关于计算正整数乘积的观察是有道理的。我想我对循环试图完成的事情感到困惑。它只是在寻找任意两个任意正数吗?是“循环不变断言”assert(sum == i*(x+1));?
  • 假设我关于作业的理论是正确的,循环应该是用户输入的“计算正整数的乘积”。所以它不是“寻找任何两个任意正数”。是的,循环不变量就是那个断言。 :-)
  • 我现在明白了,这是有道理的。谢谢。
猜你喜欢
  • 2020-03-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-12-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多