Use the same binary-search window as the iterative lesson, but pass lo and hi through recursive calls.

Algorithm

execution replay The checked-in replay follows the language-neutral state table for `search-binary-recursive`.
cross-language comparison This Ruby DSA version keeps the same data and final output as every other DSA book in this wave.

Basic Implementation

basic.rb
Replay: real traced execution (multi-file project)
arr = [1, 3, 5, 7, 9, 11, 13]
target = 11

def search(arr, target, lo, hi)
	return -1 if lo > hi
	mid = lo + (hi - lo) / 2
	return mid if arr[mid] == target
	return search(arr, target, mid + 1, hi) if arr[mid] < target
	search(arr, target, lo, mid - 1)
end

puts search(arr, target, 0, arr.length - 1)
  1. lo ← 0, hi ← 6, target ← 11

    1arr = [1, 3, 5, 7, 9, 11, 13]2target = 11
    values this step0lo6hi11target
  2. mid ← 3, arr[mid] ← 7, next call ← (4, 6)

    5return -1 if lo > hi6mid = lo + (hi - lo) / 27return mid if arr[mid] == target
    values this step3mid7arr[mid](4, 6)next call0lo6hi
  3. mid ← 5, arr[mid] ← 11, result ← 5

    5return -1 if lo > hi6mid = lo + (hi - lo) / 27return mid if arr[mid] == target
    values this step5mid11arr[mid]5result4lo6hi
  4. stdout ← 5

    1arr = [1, 3, 5, 7, 9, 11, 13]2target = 11
    values this step5stdout5result

Complexity

  • Time: O(log n)
  • Space: O(log n) call stack

Implementation notes

  • search(arr, target, lo, hi) is a Ruby method that returns an integer index or -1; it does not mutate the array.
  • The base case is return -1 if lo > hi, so an empty search window returns the miss sentinel immediately.
  • mid = lo + (hi - lo) / 2 uses Ruby integer division to produce an array index.
  • The method reads arr[mid] directly for the equality check and then for the branch comparison.
  • On a match, return mid sends the found index back through the recursive call chain.
  • If arr[mid] < target, the next call is search(arr, target, mid + 1, hi); otherwise it searches lo through mid - 1.
  • The trace starts with bounds (0, 6), sees arr[3] = 7, recurses right to (4, 6), then finds arr[5] = 11.
  • puts search(arr, target, 0, arr.length - 1) prints the returned index 5.