此示例代码中的循环不变量是什么 这是用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):
y>=n
x<=m
z>=0
我仍然不确定这一点。感谢。
答案 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