【发布时间】:2014-12-15 00:55:56
【问题描述】:
我在试图理解“不变”和“变体”这个词以及它与 c 编程的关系时遇到了问题。它在我的教科书中被大量使用,我的教授也经常提到它,但即使在阅读了其他关于堆栈溢出的回复后,我似乎也无法正确理解它。
这是我的教授提到的一个声明:
“Euclid 的 gcd 算法之所以有效,是因为它保持不变的 gcd(m, n) = gcd(n, r),其中 r = m mod n”
我认为这是提到的欧几里德 GCD 的简化伪代码:
gcd(m, n) = gcd(n, r)
- r = m % n
- m = n
- n = r
我对短语的不变部分感到困惑。来自维基百科的说法是,不变量是“在某个执行阶段始终为真的逻辑断言”。但老实说,我不太明白它们的意思。
为什么 gcd(m,n) = gcd(n,r) 被认为是不变量?有人能把这个短语变哑,让像我这样没有受过教育的人能理解为什么下面的例子是不变的吗?
是否有人可以提供任何简单的变体程序示例,以便我可以看到变体和不变量之间的区别?如有任何帮助,我将不胜感激。
【问题讨论】:
-
我真的很好奇你的教授试图教你的“变体”的定义是什么;通常当我看到我认为“有人只是在寻找一种不同的做事方式”
-
它们的意思是,在程序中的那个时刻,语句总是(“总是”)为真。
-
感谢 Rici,这更有意义。我认为这是一时兴起的例子。我们并没有真正涵盖变体或不变量。
标签: algorithm invariants