簡體   English   中英

努力尋找冪循環不變性 function

[英]Struggling to find loop invariant in power function

我正在努力為以下 function 找到一個好的循環不變式,它返回 a^b,其中 a 是實數,b 是自然數:

power <- function(a, b){
     c <- 1
     while(b > 0){
          if(b %% 2 == 1){
               c <- c * a
          }
          b <- floor(b / 2)
          a <- a * a
     }
     return c
}

我已經用幾個例子遍歷了循環,我看到它有兩種情況; 當 b 為偶數或奇數時。 我也明白在第 k 次迭代中,a = a_0^(2^k),但我正在努力尋找合適的不變量,因為沒有真正的迭代變量可供使用。

為了使不變量有用,它必須有c = a_0^b_0作為 while 循環終止后的特例,這發生在b = 0時。

為了使不變量為真,我們必須在第一次迭代之前在左側獲得a_0^b_0 我們已經知道左側有一個c ,並且在第一次迭代之前c = 1 ,所以乘法似乎是個好主意。

無論我們乘以什么,都必須在循環終止后最終為 1,這(和以前一樣)發生在b = 0時。 b為 0 時使某個值等於 1 表明我們希望b是一個指數,而左側所需的a_0^b_0也表明b應該是一個指數。

將這些放在一起,不變量將是c * a_0^b = a_0^b_0c * a^b = a_0^b_0 我將留給您來確定其中哪一個是正確的,並證明它實際上是不變的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM