I'm trying to implement a recursive binary search for this List<int>
List<int> primes = new List<int>() { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
Console.WriteLine(RecursiveBinarySearch.FindNumber(primes, 9));
Console.WriteLine(RecursiveBinarySearch.FindNumber(primes, 12));
Here's my Recursive Binary Search
public static class RecursiveBinarySearch
{
public static bool FindNumber(List<int> setOfNumbers, int targetNumber)
{
if (setOfNumbers.Count == 0)
{
return false;
}
int midpoint = setOfNumbers.Count / 2;
if (setOfNumbers[midpoint] == targetNumber)
{
return true;
}
if (setOfNumbers[midpoint] < targetNumber)
{
setOfNumbers.RemoveRange(setOfNumbers[0], midpoint);
return FindNumber(setOfNumbers, targetNumber);
}
else
{
setOfNumbers.RemoveRange(setOfNumbers[midpoint + 1], setOfNumbers.Count - 1);
return FindNumber(setOfNumbers, targetNumber);
}
}
}
I'm getting
ArgumentException
index and count do not denote a valid range of elements in the List
in this line:
if (setOfNumbers[midpoint] < targetNumber)
{
setOfNumbers.RemoveRange(setOfNumbers[0], midpoint);
return FindNumber(setOfNumbers, targetNumber);
}
Here's a screenshot of the values of my variables in Visual Studio. https://snipboard.io/iQ6ZIc.jpg
If you have run the code or viewed the screenshot, you can see that midpoint is 2 so both arguments for RemoveRange() are valid and within range which is why I don't understand why it throws the exception.
What am I missing?
RemoveRangeshould be an index, not a number of the list. Soo instead ofRemoveRange(setOfNumbers[0],...)andRemoveRange(setOfNumbers[midpoint + 1],...)tryRemoveRange(0, ...)andRemoveRange(minpoint + 1, ...)RemoveRange(midPoint + 1, count - 1)will also fail, because you want to remove the half of the elements, notcount - 1elements.public static bool FindNumber(List<int> setOfNumbers, int targetNumber) => setOfNumbers.BinarySearch(targetNumber) >= 0