我在尝试理解“不变”和“变体”这个词以及它与c中的编程有什么关系时遇到了问题。它在我的教科书中经常使用,而且我的教授常常提到它,但即使在阅读了有关堆栈溢出的其他回复后,我似乎无法正确理解它。
这是我教授提到的一个陈述:
“Euclid的gcd算法有效,因为它保持了不变的gcd(m,n)= gcd(n,r),其中r = m mod n”
我认为这是Euclid的GCD的愚蠢的伪代码,提到:
gcd(m,n)= gcd(n,r)
我对短语的不变部分感到困惑。从维基百科中可以看出,不变量是“在执行的某个阶段始终保持真实的逻辑断言”。但说实话,我不太明白他们的意思。
为什么gcd(m,n)= gcd(n,r)被认为是不变的?有人能够愚蠢地说这句话,所以像我自己一样没有受过教育的人可以理解为什么下面的例子是一个不变量?
是否有任何人可以提供的简单变体程序示例,以便我可以看到变体和不变量之间的区别?我很感激任何帮助。
答案 0 :(得分:0)
如果我们采用维基百科定义,则不变量将是“当前数字对的GCD与原始数字对的GCD相同”。我们从一对到另一对的方式({m,n} - > {n,m%n})当然是算法的一部分,但与invariant并不真正相关。
因此,在这些术语中,可以描述算法:每次我们使用相同的答案跳转到更容易(较小数字)的问题。
答案 1 :(得分:0)
这已得到回答,但似乎没有解决不变性的真正含义。不变量是问题中不会改变的属性。
例如,考虑以下谜题:有一个棋盘,对角线对角的方块缺失。是否可以用多米诺骨牌(一对正方形,一个黑色和一个白色)平铺棋盘。现在,如果你看一下这个问题,就可以看到有一个固定的属性:当一个瓷砖被移除时,会删除一个黑色和一个白色方块。因此,不变量是属性:黑色方块的数量==白色方块的数量。因此,我们可以得出结论,问题是无法解决的,因为相反的方块具有相同的颜色,并且我们有一个修改过的棋盘,黑棋和白人的数量不等。
所以教授试图做的基本上是确定一个在问题的生命周期内没有变化然后使用它的属性。