迴圈不變數
1、迴圈開始時需要做什麼?
之前我們講的線性查詢法的核心程式碼如下:
public static <E> int search(E [] data,E target){
for (int i = 0; i < data.length; i++)
if (data[i].equals(target))
return i;
return -1;
}
我們是否有思考過,這樣一個簡單的查詢演算法,用到了迴圈,但是每一輪迴圈開始前,需要滿足的條件是什麼?
其實,迴圈開始時,需要確認:
確認data[i]是否是目標
透過語句,if (data[i].equals(target))判斷
迴圈體執行完一次時:
我們確認了data[i]不是目標,換句話,即:data[0…i]中沒有找到目標。
注:方括號[]表示的時閉區間,圓括號()表示的是開區間。
閉區間包含開閉的元素,開區間不包含開閉的元素。
也可以半開半閉,即:(],或者[)。
即:data[0…i],也可以表示為data[0…i-1)
2、什麼是迴圈不變數?
什麼是迴圈不變數呢?
迴圈不變數定義:即每一輪迴圈開始時,迴圈都滿足的性質或者條件。
3、迴圈不變數的作用
迴圈不變數的作用,其實如定義所講,幫助我們釐清每一輪迴圈開始時迴圈所處的條件。有助於釐清演算法實現的思路。
在迴圈中,迴圈體的作用,就是維持迴圈不變數。
迴圈體和迴圈不變數的關係,本身也是”證明“演算法正確性的一種方式。
這裡的”證明“用了引號,因為並不是嚴謹的數學證明。
其實,每次迴圈開始時,滿足一個條件,
即:data[0……i-1]中沒有找到目標。
總結重點:
寫出正確的程式碼,需要定義清楚迴圈不變數,迴圈體的作用就是為了維持迴圈不變數。