每次我使用递归javascript时使用相同的数组

时间:2018-05-13 07:33:31

标签: javascript

每次进行递归调用时,如何使用相同的数组?

我不会拼接数组,我需要在同一个数组中工作,只需更改数组的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;
}

2 个答案:

答案 0 :(得分:0)

由于递归算法必须进行,我将数组的修改转换为两个索引(startend)的更新:

  • 在函数的签名
  • middleIndex
  • 的计算中
  • 在递归的终止条件
  • 在递归&#34;进展&#34; (选择数组的第一个或第二个半部分)

&#13;
&#13;
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;
&#13;
&#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);
}