写作原因:在某些算法中,我们会涉及到使用循环才能够解决特定的问题,但是当涉及到循环中的语句表达的时候,就会涉及到边界的处理,有时候因为处理不好而导致不停的debug才会得到正确的结果,导致这些原因是因为我们没有好好的处理好边界问题,也就是没有真正的get到“循环不变量”的原因
正文: 当设计到一个有序的数组中,要查找到一个target值的时候,就会涉及到循环语句中判断的设计,这个时候我们就可以利用循环不变量来进行处理,直接上代码
function binarySearch(arr, target) {
// 二分法来查找arr中的target值
var left = 0,
right = arr.length - 1;
// 表示在[left, right]的范围里边找到target的索引范围,要明白变量的意义
while (left <= right) { // 当 left == right是,区间[left...right]范围依然有效,所以使用的是 <=
var mid = Math.floor((left + right) / 2);
if (arr[mid] == target) return mid;
// 说明target在[mid+1, right]索引范围里边
if (target > arr[mid]) left = mid + 1;
else right = mid - 1; // target在[left, mid-1] 范围里边找
}
return -1; // 说明没有找到
}
console.log(binarySearch([1, 2, 3, 4, 5, 6], 3));
其实循环不变量的作用就是说我们的变量的意义要不变,始终要在有效的范围内,这是保证程序正确性的一种方法