Loops 理解循环不变量。为算法找到并证明它们
我需要一点帮助来理解循环不变量。我只需要有人解释如何找到循环不变量,并用以下算法证明它:Loops 理解循环不变量。为算法找到并证明它们,loops,Loops,我需要一点帮助来理解循环不变量。我只需要有人解释如何找到循环不变量,并用以下算法证明它: public int sumSquares ( int n ) { int sum = 0 ; for ( int i = 1 ; i <= n ; i++) { sum += i ∗ i ; } return sum ; } public int-sumSquares(int-n) { 整数和=0; 对于(inti=1;i循环不变量是一个在循
public int sumSquares ( int n )
{
int sum = 0 ;
for ( int i = 1 ; i <= n ; i++)
{
sum += i ∗ i ;
}
return sum ;
}
public int-sumSquares(int-n)
{
整数和=0;
对于(inti=1;i循环不变量是一个在循环每次迭代前后都可以证明为真的语句。事实证明有很多这样的语句,但技巧是证明一个确实有用的语句
例如,确实
每次迭代前后,i
的值始终等于i
不是很有帮助。相反,想想你想证明什么
当i
等于n
时,sum
等于前n个平方的和
在这种情况下,如果你想证明你的算法产生了前n个平方的和,你需要声明以下不变量
sum
的值等于第一个i
平方的和
您还可以注意到与数学归纳法的相似之处
当你证明一个属性成立时,你就证明了一个基本情况和一个归纳步骤
如果不变量在第一次迭代之前保持不变,则与基本情况类似。表明不变量循环在一次迭代到另一次迭代之间保持不变类似于归纳步骤。正如其他人所说,不变量在每次迭代之前和之后都是真的。一般来说,它在循环中的某个地方无效,随后会恢复
要建立证明,您需要跟踪各个语句之间的条件,并将它们与不变量关联起来
对于给定的示例,请遵循注释;为清晰起见,For
语句重写为while
int sum = 0 ;
i= 1;
// This trivially establishes the invariant: sum == 0 == Σ k² for 0<=k<i=1
while (i <= n)
{
// The invariant is still true here (nothing changed)
sum += i ∗ i ;
// We now have sum == Σ k² for 0<=k<=i (notice the <=; this differs from the invariant)
i++;
// As i has been increased, sum == Σ k² for 0<=k<i is restored
}
// Here the invariant holds, as well as i == n+1
// Hence sum == Σ k² for 0<=k<n+1
return sum ;
int和=0;
i=1;
//这很容易建立不变量:sum==0==∑k²表示0