============================================================
 RECURSIVE FUNCTIONS - Demo Run
============================================================

--- factorial (recursive vs iterative) ---
  factorial(0): recursive=1, iterative=1, match=True
  factorial(1): recursive=1, iterative=1, match=True
  factorial(5): recursive=120, iterative=120, match=True
  factorial(10): recursive=3628800, iterative=3628800, match=True

--- fibonacci (recursive vs iterative) ---
  fibonacci(0): recursive=0, iterative=0, match=True
  fibonacci(1): recursive=1, iterative=1, match=True
  fibonacci(10): recursive=55, iterative=55, match=True

--- Missing base case -> RecursionError, then fixed ---
  Caught RecursionError -- confirmed missing base case crashes as expected.
  fixed_countdown(5) completed without error once base case was added.

--- sum_digits ---
  sum_digits(12345) = 15

--- reverse_string_recursive ---
  reverse_string_recursive('hello') = olleh

--- count_nested_items ---
  count_nested_items([1, [2, 3, [4, 5]], 6, [[7], 8]]) = 8

--- Call-count discussion: naive fibonacci(10) ---
  fibonacci(10) made 177 recursive calls to compute just 1 value
  (inefficient: fibonacci(8) is recomputed many times inside the tree of calls)

============================================================
 Assignment: recursive binary_search
============================================================
  binary_search(data, 23) = index 5
  binary_search(data, 2) = index 0
  binary_search(data, 91) = index 10
  binary_search(data, 99) = index -1
