javascriptalgorithmbinary-search

Binary search function is correct but it returns undefined


I have this function to do binary search

const binarySearch = (array, value) => {
    let min = 0;
    let max = array.length - 1;
    return doBinary(array, min, max, value);
};

/**
* DoBinary
*/

function doBinary(arr, min, max, key) {
    let med = Math.floor((min + max) / 2);
    let diff = max - min;
    if (arr[med] === key) {
          console.log(med) // <====================== med here is correct, but it returns only undefined
          return  med;   // <========================= problem in this line
/*
* Returns only if the Index of the key that I'm searching for, `equals` the middle of the original array
* otherwise, returns undefined,
*/
         }
    else if (diff > 0 && arr[med] < key) {
        min = med + 1;
        doBinary(arr, min, max, key);
    }
    else if (diff > 0 && arr[med] > key) {
        max = med - 1;
        doBinary(arr, min, max, key);

    }
    else return -1;

// return med;

}

This function returns only if the Index of the key that I'm searching for, equals the middle of the original array. otherwise, returns undefined.

Example:

A = [1,2,3,4,5];
binarySearch(A, 1) //undefined
binarySearch(A, 2) //undefined
binarySearch(A, 3) //2
binarySearch(A, 4) //undefined
binarySearch(A, 5) //undefined

Solution

  • Please see the updated code, you need to return the doBinary response when you are using recursive functions.

    function doBinary(arr, min, max, key) {
      let med = Math.floor((min + max) / 2);
      let diff = max - min;
      if (arr[med] === key) {
        console.log(med) // <====================== med here is correct, but it returns only undefined
        return med;   // <========================= problem in this line
        /*
        * Returns only if the Index of the key that I'm searching for, `equals` the middle of the original array
        * otherwise, returns undefined,
        */
      }
      else if (diff > 0 && arr[med] < key) {
        min = med + 1;
        return doBinary(arr, min, max, key);
      }
      else if (diff > 0 && arr[med] > key) {
        max = med - 1;
        return doBinary(arr, min, max, key);
    
      }
      else return -1;
    
      // return med;
    
    }