每次进行递归调用时,如何使用相同的数组?
我不会拼接数组,我需要在同一个数组中工作,只需更改数组的fromIndex和endIndex。
function BinarySearch(values, searchedValue) {
var middleIndex = Math.floor(values.length / 2);
var middleValue = values[middleIndex];
if (middleValue === searchedValue) return true;
else if (middleValue < searchedValue && values.length > 1) {
return BinarySearch(values[0,middleIndex], searchedValue);
}
else if (middleValue > searchedValue && values.length > 1) {
return BinarySearch(values.splice(0, middleIndex), searchedValue);
}
else return false;
}
答案 0 :(得分:0)
由于递归算法必须进行,我将数组的修改转换为两个索引(start
和end
)的更新:
middleIndex
function BinarySearch(values, start, end, searchedValue) {
var middleIndex = Math.floor((start + end) / 2);
var middleValue = values[middleIndex];
if (middleValue === searchedValue) return true;
else if (middleValue < searchedValue && end-start > 1) {
return BinarySearch(values, start, middleIndex, searchedValue);
} else if (middleValue > searchedValue && values.length > 1) {
return BinarySearch(values, middleIndex, end, searchedValue);
} else return false;
}
let input = [1, 2, 5, 12, 25];
console.log(BinarySearch(input, 0, input.length-1, 5));
console.log(BinarySearch(input, 0, input.length-1, 8));
&#13;
如果有些事情仍然不清楚,请告诉我。
答案 1 :(得分:0)
您可以轻松地进行实施,而无需更改算法并且不会改变阵列。你只需要在递归时跟踪你的位置,只需将这些信息传递给一个内部的局部递归函数,就像递归一样。
function BinarySearch(values, searchedValue) {
function doSearch(left,right) {
var middle = Math.floor((left + right) / 2);
var middleValue = values[middle];
if (middleValue === searchedValue)
return middle;
if ((right-left) <= 1)
return -1;
else if (middleValue > searchedValue)
return doSearch(left,middle);
else if (middleValue < searchedValue)
return doSearch(middle,right);
else
return -1;
}
return doSearch(0,values.length);
}