2

Why is my algorithm returning “-1” meaning that target value 73 isn’t in the array? (When clearly 73 is in the array). [this is from Khan Academy, but isn't helping]

It's supposed to return either the index of the location in the array, or "-1" if the array did not contain the targetValue

Var doSearch = function(array, targetValue) {
    var min = 0;
    var max = array.length - 1;
    var guess;
    while(max >= min) {
        guess = floor((max*1 + min*1) / 2);
        if (guess === targetValue) {
            return guess;
        } else if (guess < targetValue) {
            min = guess + 1;
        } else {
            max = guess - 1;
        }
    }
    return -1;
};

var primes = [2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 
    41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97];

var result = doSearch(primes, 73);
println("Found prime at index " + result);
6
  • 1
    guess = floor Can you post your floor function? (assuming it's different from Math.floor) Commented Jun 15, 2018 at 0:29
  • 1
    What's the point of writing max*1 and min*1. Multiplying by 1 doesn't change a number. Commented Jun 15, 2018 at 0:29
  • 1
    you have specified in your code "return -1" Commented Jun 15, 2018 at 0:30
  • You're not even iterating through the array. Your function will always return -1. Commented Jun 15, 2018 at 0:31
  • @HoCo_ you may have missed the other return statement. I've formatted the question to make them clearer Commented Jun 15, 2018 at 0:32

2 Answers 2

5

You're setting guess to an array index, but then you're comparing it with targetValue. You need to compare the array element at that index.

var doSearch = function(array, targetValue) {
  var min = 0;
  var max = array.length - 1;
  var guess;
  var guessvalue;
  while (max >= min) {
    guess = Math.floor((max * 1 + min * 1) / 2);
    guessValue = array[guess];
    if (guessValue === targetValue) {
      return guess;
    } else if (guessValue < targetValue) {
      min = guess + 1;
    } else {
      max = guess - 1;
    }
  }
  return -1;
};

var primes = [2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37,
  41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97
];

var result = doSearch(primes, 73);
console.log("Found prime at index " + result);

Sign up to request clarification or add additional context in comments.

Comments

1

Your function doSearch() doesn't compare any value of the array to the targetValue. You need to access the guess position and compare it, like this:

var doSearch = function(array, targetValue) {
    var min = 0;
    var max = array.length - 1;
    var guess;
    while(max >= min){
        guess = Math.floor((max*1 + min*1) / 2);
        if (array[guess] === targetValue) {
            return guess;
        } else if (array[guess] < targetValue) {
            min = guess + 1;
        } else {
            max = guess - 1;
        }
    }
    return -1;
};

var primes = [2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 
41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97];

var result = doSearch(primes, 73);
console.log("Found prime at index " + result);

Warning: The function floor() doesn't exist in JavaScript. You should use Math.floor(). Also, the function println(). Use console.log() instead.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.