2013-10-06 72 views
0

我需要拿出一個循環不變對於給定的一段代碼:這段代碼的循環不變量是什麼?

//pre: x & y >= 0 
//post: z = x^y 
//computes pow(x, y), x^y 
int pow(int x, int y){ 
    int z = 1; 
    while(y > 0){ 
     if(y%2==0){ 
      y /= 2; 
      x = x*x; 
     }else{ 
      z = z*x; 
      y -= 1; 
     } 
    } 
    return z; 
} 

我不變的是:

{(ypre - 0 = 0 & x = x^(ypre -y)) OR (ypre - y != 0 & x^(n + m) = x^(ypre - y), where (n=ypre-y) and (m=integer value of z/x))} 

這是一個混亂不變的,我不是100%確定這是正確的。有一個更好的不變量,將覆蓋Z = X^y的交條件

+0

希望這是正確的網站中發佈此。 – ceptno

+0

X^y是.. 。x xor y? (我不是那麼傻,但它肯定會幫你說出你的意思) – sehe

回答

1

我建議一個環變體是

  • x'^y' == (x^y)/z(其中x'y'是任何迭代後修飾的輸入)
  • x' >= x0 <= y' < y(這證明,該算法將完成)
+0

當x = 2,y = 3時呢?在第三次迭代x = 4時,y = 1所以4^1!= 2^1。 – ceptno

+0

@Brandon oops我忽略了等式中的因子「z」。固定。 – sehe

+0

有什麼可以告訴我你是如何得出這個結論的?這個解決方案非常乾淨和簡單。 – ceptno