以下代码中的循环不变量是什么?

时间:2011-10-03 07:06:35

标签: loops conditional-statements invariants loop-invariant

此示例代码中的循环不变量是什么 这是用C编程语言实现的摘录代码:

//pre-condition m,n >= 0
x=m;
y=n;
z=0;
while(x!=0){
  if(x%2==0){
    x=x/2;
    y=2*y;
  }
  else{
    x=x-1;
    z=z+y;
  }
}//post-condition z=mn

这些是我最初的答案(Loop Invariant):

  1. y>=n
  2. x<=m
  3. z>=0
  4. 我仍然不确定这一点。感谢。

1 个答案:

答案 0 :(得分:2)

你的答案确实是不变的,但对循环的条件几乎没有说明。你总是需要寻找特定的不变量。在这种情况下,它非常简单,因为循环中只有两个(独占)操作。

第一个x' = x/2; y' = 2*y;看起来在x*y下是不变的。

第二个x' = x-1; z' = z+y;不是:x'*y' = x*y - y。但是如果再次添加z,它将是不变的。 z'+x'*y' = z + y + x*y - y = z+x*y

幸运的是,第一个条件在z+x*y下是不变的,因此我们找到了一个循环不变量。

  • 前提条件:z+x*y = m*n
  • 后置条件:x=0(循环条件),因此我们可以从我们的不变量中推导出来:z = m*n