迴圈不變式

2021-06-17 16:26:04 字數 1044 閱讀 3486

先看引用自由cay horstmann寫的

computing concepts with c++ essentials (3rd)

一書的,用以計算a^n的例子:

double power(double a, int n)

else

}return r;

}

粗看一下,用此方法計算a^n時比原始方法進行迴圈次數要少很多。幾乎是1/2倍地遞減。

解釋此演算法,必須知道迴圈不變式

loop invariant

)。即這個迴圈存在一條式子,每次迴圈它都成立。既然每次迴圈都成立,必然地最後一次迴圈亦成立,故可根據這恒等式得到答案。發現這條式子是困難的,不過幸運的是,我們是證明者而不是發現者,這條迴圈不變式是:

注意到我描述的是每次迴圈都成立,這種描述方式和數學歸納法及其相似:n = 1成立,若由n = k時成立可推出n = k + 1時也成立,則對於每個n,結論都成立。證明此恒等式亦可採用相似的形式。為描述方便,約定m表示迴圈次數,對應

的,i = 0時迴圈結束,b^i = 1, r = a^n。

好奇的我,試著看標準庫的的pow()函式,驚奇的發現,它也是用迴圈不變式的,並且**更為簡潔(這是修改後**,源**還有n的正負判斷):

double power(double a, int n)

}

n & 1其實是判斷n是否為偶數,是偶數則表示式等於0,否則為1;n >>= 1等價於n = n/2.這個演算法效率更高,每次迴圈都將指數除2。

如果將**再次用i代替n,b代替a,改寫如下:

double power(double a, int n)

}

即有如下的迴圈不變式

雖然,在我以前所編的程式中,並沒發現有運用迴圈不變式的,就算有我也察覺不到。但是你只有了解了乙個技能的時候才能有機會學會它。乙個程式設計師總是有完美主義者傾向的,希望自己寫的程式簡潔效高,迴圈不變式即是提供這樣的一種方法,在特定時候。

迴圈不變式

在演算法中,有乙個重要的概念就是迴圈不變式,迴圈不變式主要用來幫助我們理解演算法的正確性。關於迴圈不變式,我們必須證明三條性質 1.初始化 迴圈的第一次迭代之前,它為真。2.保持 如果迴圈的某次迭代之前它為真,那麼下次迭代之前它仍為真。3.終止 在迴圈終止時,不變式為我們提供了乙個有用的性質,該性質...

迴圈不變式的思想及其應用

迴圈不變式的思想及其應用 迴圈不變式 loop invariants 不只是一種電腦科學的思想,準確地說是一種數學思想。在數學上闡述了通過迴圈 迭代 遞迴 去計算乙個累計的目標值的正確性,屬於基礎數學的範疇,而且在計算機上也應用廣泛。初次見到這個詞是在 演算法導論 在第二章描述了這個思想和正確性,後...

排序 插入排序(迴圈不變式)

插入排序的思想是構造乙個迴圈不變式,可用撲克牌的例子來解釋,左手為已經排好序的牌,右手為未排好序的牌,分別將右手中的牌依次一張一張地插入到左手,將左手中的每一張牌依次和這張牌比較,以此來確定這張牌在左手中的正確順序,然後進行下一張牌,在這個過程中,左手中的牌始終是排好序的,即不變的,稱為迴圈不變式 ...