了解循环不变量
Understanding loop invariants
我认识的一位正在上计算机科学课的大一新生在他的一项家庭作业上向我寻求帮助。我通读了几遍,不好意思承认我不知道他们在问什么。问题是:
下面给出了一个循环的轮廓。完成程序,使其读取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。
相关文章:
- 当调用switch语句中的函数时(即使函数不包含循环),似乎是永不结束的循环的问题
- 使用不变量来确定二分搜索中的边界条件
- C++变量等于不变量
- 有没有一种通用的方法来实现不变量
- 0 的 2D 数组 不相关循环的破坏逻辑 - C++
- 修改向量中的字符串?(不使用循环)
- 特征获取索引数组,其中向量中的值为真(不需要循环)
- 错误 C2512 视觉C++(并且不是循环依赖项)
- 变量在循环中显示,但不在循环中显示
- 未能优化看似明显的循环不变量(但volatile限定符发挥了神奇的作用)
- 递归回溯打印长度为N的二进制数的所有组合,而不使用循环
- 如何在不使用循环的情况下回到代码的顶部?
- 为什么 CLang++ 不优化循环,而 G++ 优化循环?
- 断言失败:列出迭代器不可递增(不在循环中)
- 有没有办法在不使用循环的情况下非具体地引用映射中的每个值?C++
- 如何将 A 实现到 B 中,将 B 实现到 A 中(不创建循环)?
- 了解循环不变量
- 在嵌套循环/循环不变量中检查一次
- ifstream变量循环不打印任何内容
- 使用变量而不引起循环依赖