创建了一个简单的二进制搜索,我注意到使用mid--
与mid -= 1
或mid - 1
返回不同的结果,基本上导致了函数失败。我的假设是--
和++
操作符能够在每次迭代中更改mid
的值...但它似乎非常细微,我没有真正跟踪什么“这是幕后的事。希望能在这方面得到一些帮助。
我认为mid -= 1
和mid--
都意味着取mid
并将它的值减1,两者实质上都是将-1的值重新分配给mid
变量。
工程编号
const sourceArray = [1, 5, 7, 10, 15];
const binarySearch = (array, target) => {
let low = 0;
let high = array.length - 1;
while (low < high) {
let mid = (low + high) / 2;
if (array[mid] === target) {
return mid;
} else if (array[mid] > target) {
// if array[mid] > target, set high to mid--
high = mid--;
} else {
// if array[mid] < target, set low to mid++
low = mid++;
}
}
return [];
};
console.log(binarySearch(sourceArray, 7));
console.log(binarySearch(sourceArray, 10));
console.log(binarySearch(sourceArray, 15));
console.log(binarySearch(sourceArray, 20));
// returns
// 2
// 3
// 4
// []
不工作
const sourceArray = [1, 5, 7, 10, 15];
const binarySearch = (array, target) => {
let low = 0;
let high = array.length - 1;
while (low < high) {
let mid = (low + high) / 2;
if (array[mid] === target) {
return mid;
} else if (array[mid] > target) {
// if array[mid] > target, set high to mid--
high = mid -= 1;
} else {
// if array[mid] < target, set low to mid++
low = mid += 1;
}
}
return [];
};
console.log(binarySearch(sourceArray, 7));
console.log(binarySearch(sourceArray, 10));
console.log(binarySearch(sourceArray, 15));
console.log(binarySearch(sourceArray, 20));
// returns
// 2
// []
// []
// []
2条答案
按热度按时间8i9zcol21#
后置递减运算子(
--
)会传回值,然后将其递减,因此如果mid
为3,则您的行:将
high
设置为3,然后将mid
减1,mid
中保留2。在第二个示例中,同一行上有两个分配:
让我们再次使用值为3的
mid
的示例。一个语句中的多个赋值操作是从右向左进行的。首先,从mid
中减去1,并将值2存储到mid
中。然后,将2赋值给high
。hl0ma9xz2#
首先,
while
条件应该是low <= high
。考虑使用一个单一元素的数组,它根本不会进入循环。其次,您应该改用
Math.floor((low + high) / 2);
。假设low
和high
具有不同的奇偶校验。显然,mid将是一个小数值。例如,您将访问未定义的sourceArray[2.5]
。最后,应该使用前缀increment和decrement,因为它们在递增和递减之后返回值,即
--mid
和++mid
我对你的代码所做的修改: