循环不变量(loop invariant)是一个不变量,被用来证明循环的特点,更多地,算法使用循环 (usually 正确性)。非正式的说,一个循环不变量是指在循环开始和循环中每一次迭代时永远为真的量,这意味着在循环中和循环结束时循环不变量和循环终止条件必须同时成立。
以二分法为例:已知 A[1..n] 是单调递增的数列,求 A 中所有大于或等于target的值中,最小的那一个的序号。
int binary_search(int* A, int n, int target){
int low = 0, high = n-1;
assert(A != NULL && n >= 0);
while (low <= high){
int mid = low + (high - low)/2;
if (A[mid] == target)
return mid;
else if (A[mid] < target)
low = mid + 1;
else
high = mid - 1;
}
return -1;
}
在循环中用到的变量是low, high,首先想到的循环不变量是 F(low, high) :=(a[low] <= v <= a[high]),但其中的问题也是显而易见的:循环开始时,v 可能小于a[1],也可能大于a[n],而在循环过程中,如果a[mid-1] < v < a[mid],或者 a[mid] < v < a[mid+1],也会导致F(low, high