【发布时间】:2021-05-10 17:11:15
【问题描述】:
function getMiddle({right,left}) {
return Math.floor((left + right) / 2);
}
function RecursivelyBinarySearch(arr, search) {
let left = 0;
let right = arr.length - 1;
let middle = getMiddle({left,right});
if (right >= left) {
if (arr[middle] === search) {
return middle;
} else if (arr[middle] < search) {
return RecursivelyBinarySearch(arr.slice(middle + 1, arr.length), search);
} else {
return RecursivelyBinarySearch(arr.slice(0, middle - 1), search)
}
}
return -1;
}
let result = RecursivelyBinarySearch([1,5,7,9,10,20], 20);
console.log(result);
// RecursivelyBinarySearch([1,5,7,9,10,20], 20)
RecursivelyBinarySearch 返回 0,但我希望它是 5,
是否可以在不传递原始数组的情况下执行此操作?
【问题讨论】:
-
是的:
return left + RecursivelyBinarySearch(...). -
@Welbog-
+运算符如何处理数组? OP面临的问题是返回是原始数组的突变,它越来越小,直到数组中唯一剩余的值是搜索值。因此,该值的索引将始终为零。将零添加到数组(返回值)不是解决方案。 -
解决方案也不是在二进制搜索中寻找数组索引,因为你会破坏算法的效率。还有其他算法可以实现这一目标。 (就像一个简单的 while 循环 - 更快,一个传统的
for循环)。 -
底线是你不能改变一个数组并期望得到原始元素中找到的元素的位置而不是每次都传递原始数组。
-
@RandyCasburn 不确定您在读什么,但这会返回一个 int,并且添加下限将产生正确的结果,因为这说明了查看一半时省略的数组大小剩余数组。
标签: javascript recursion data-structures