题
这个词似乎在许多情况下被使用。我能想到的最好的是它们意味着一个无法改变的变量。是不是常数/决赛(你是Java!)是为了什么?
解决方案
不变量更具“概念性”。而不是变量。通常,程序状态的属性始终为true。确保不变量成立的函数或方法据说可以保持不变量。
例如,二叉搜索树可能具有不变量,对于每个节点,节点的左子节点的键小于节点自己的键。正确编写此树的插入函数将保持不变。
正如您所知,这不是您可以存储在变量中的那种东西:它更像是一个声明关于该程序。通过确定程序应该维护哪种不变量,然后查看代码以确保它实际维护这些不变量,可以避免代码中的逻辑错误。
其他提示
这是一个条件,你知道在逻辑中的某个特定位置始终是真的,并且可以检查何时调试以找出出错的地方。
我通常在算法或结构方面更多地查看它们。
例如,您可以拥有一个可以断言的循环不变量 - 在每次迭代的开始或结束时始终为true。也就是说,如果你的循环应该处理从一个堆栈到另一个堆栈的对象集合,你可以在循环的顶部或底部说| stack1 | + | stack2 | = c。
如果不变检查失败,则表示出现了问题。在这个例子中,它可能意味着您忘记将已处理的元素推送到最终堆栈等。
维基百科的神奇之处: Invariant(计算机科学)
在计算机科学中,一个谓词, 如果是真的,将在整个过程中保持真实 具体的操作顺序是 称(a)对此不变 序列
正如这条线所述:
在计算机科学中,一个谓词,如果是真的,将在整个特定的操作序列中保持为真,称为(a)对该序列不变。
为了更好地理解这个希望,C ++中的这个例子有帮助。
考虑一个场景,你必须得到一些值并在一个名为 count
的变量中得到它们的总数,然后将它们添加到一个名为 sum
<的变量中/ p>
不变(再次更像是一个概念):
// invariant:
// we have read count grades so far, and
// sum is the sum of the first count grades
上面的代码就是这样的,
int count=0;
double sum=0,x=0;
while (cin >> x) {
++count;
sum+=x;
}
以上代码的作用是什么?
1)从 cin
读取输入并将它们放入 x
2)成功读取一次后,递增 count
和 sum = sum + x
3)重复1-2直到读取停止(即ctrl + D)
循环不变量:
不变量必须为True 始终。所以最初你只用这个
开始你的代码while(cin>>x){
}
此循环从标准输入读取数据并存储在x中。好,好。但不变会变为false,因为不变的第一部分未被跟踪(或保持为真)。
// we have read count grades so far, and
如何保持不变量?
简单!增量计数。
所以 ++ count;
会做得好!现在我们的代码就像这样,
while(cin>>x){
++count;
}
但是
即使现在我们的不变(一个必须为TRUE的概念)也是假的,因为现在我们没有满足我们的不变量的第二部分。
// sum is the sum of the first count grades
那现在该怎么办?
将 x
添加到 sum
并将其存储在 sum
( sum + = x
)中,下一次
cin&gt;&gt; x
会将新值读入x。
现在我们的代码就像这样,
while(cin>>x){
++count;
sum+=x;
}
我们来检查
代码是否与我们的不变量
匹配 <*>代码:
<*>啊!现在循环不变量是True 始终并且代码工作正常。
以上示例是从本书加速C ++ 中获取并修改了Andrew-koening和Barbara-E
在代码块中没有改变的东西
继续它之后,不变量在编写干净的代码时非常有用,因为从概念上了解应该在代码中出现的不变量允许您轻松决定如何组织代码以达到这些代码旨在。如上所述,它们在调试时也很有用,因为检查是否维护不变量通常是一种很好的方式,可以看出你尝试执行的操作是否实际上正在按照你的意愿行事。
这通常是在某些数学运算下不会改变的数量。 示例是标量,在旋转下不会更改。例如,在磁共振成像中,通过旋转不变量来表征组织特性是有用的,因为它的估计理想地不依赖于扫描仪中身体的方向。
ADT不变量指定关系 在数据字段中(实例变量) 之前和之后必须始终如一 执行任何实例方法。