什么是不variables?
这个词似乎在许多情况下被使用。 我能想到的最好的是他们的意思是一个不能改变的variables。 难道不是什么常量/决赛(难道你是Java!)?
不variables比variables更“概念化”。 一般来说,这是程序状态的一个属性,总是正确的。 保证不variables的函数或方法被认为是保持不变的。
例如,二叉search树可能具有不变性,即对于每个节点,节点的左子节点的密钥小于节点自己的密钥。 一个正确的插入函数为这棵树将保持不变。
正如你所看到的那样,这不是你可以存储在一个variables中的东西:它更像是一个关于程序的声明。 通过计算你的程序应该维护什么types的不variables,然后检查你的代码以确保它实际上保持了这些不variables,你可以避免代码中的逻辑错误。
这是一个你知道在你的逻辑的某个特定位置总是成立的条件,并且可以在debugging的时候检查出什么地方出了问题。
我通常从algorithm或结构的angular度来看待它们。
例如,你可以有一个可以被断言的循环不变式 – 在每次迭代的开始或结束时总是为真。 也就是说,如果您的循环应该处理从一个堆栈到另一个堆栈的对象的集合,您可以在循环的顶部或底部说| stack1 | + | stack2 | = c。
如果不变检查失败,则表明出现了问题。 在这个例子中,这可能意味着你忘了把处理过的元素推到最后的堆栈等等。
维基百科的魔力: 不变(计算机科学)
在计算机科学中,一个谓词,如果是真的,在整个特定的操作序列中将保持为真,则被称为(an)该序列不变的。
在代码块中不变的东西
继续之前,不variables在编写干净的代码时非常有用,因为从概念上了解应该在代码中出现哪些不variables,这使得您可以轻松地决定如何组织代码以实现这些目标。 就像ealier提到的那样,它们在debugging时也很有用,比如检查是否维护不变是一个很好的方法,看看你正在执行的任何操作实际上正在做你想做的事情。
ADT不variables指定数据字段(实例variables)之间的关系,在执行任何实例方法之前和之后必须始终为true。
正如这行指出:
在计算机科学中,一个谓词,如果是真的,在整个特定的操作序列中保持为真,则被称为(an)对于该序列是不变的。
为了更好地理解这个希望这个例子在C ++中有所帮助。
考虑一个场景,你必须得到一些值,并获得一个名为count
的variables的count
,并将它们添加到名为sum
的variables中
不variables (再次更像是一个概念):
// 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
读取input并将其放入x
2)一次读取成功后,递增count
和sum = sum + x
3)重复1-2,直到读取停止(即ctrl + D)
循环不变:
不变必须是真的总是 。 所以最初你只是用这个开始你的代码
while(cin>>x){ }
这个循环从标准input读取数据并存储在x中。 好,好。 但是不variables变成了虚假的,因为我们的不variables的第一部分没有被遵循(或被保留)。
// we have read count grades so far, and
如何保持不变的真实?
简单! 增量计数。
所以++count;
会做得很好! 现在我们的代码变成了这样的东西,
while(cin>>x){ ++count; }
但
即使现在我们的不variables (一个必须为TRUE的概念)也是假的,因为现在我们不满足我们不variables的第二部分。
// sum is the sum of the first count grades
那现在该怎么办?
添加x
进行sum
并将其存储在sum
( sum+=x
)中,下一次cin>>x
将读入一个新的值到x中。
现在我们的代码变成了这样的东西,
while(cin>>x){ ++count; sum+=x; }
让我们检查
代码是否匹配我们的不variables
// invariant: // we have read count grades so far, and // sum is the sum of the first count grades
码:
while(cin>>x){ ++count; sum+=x; }
啊!。 现在循环不变总是为真,代码工作正常。
上面的例子是由Andrew-koening和Barbara-E编写的“ Accelerated C ++ ”一书的