[英]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_0
或c * a^b = a_0^b_0
。 我將留給您來確定其中哪一個是正確的,並證明它實際上是不變的。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.