numbers = [2, 10, 103, 220, 241, 245, 503] def contains1(numbers, n): """ Returns True if n is in the list numbers. """ # Brute force: look at every number and see. for i in numbers: if i == n: return True return False def contains2(numbers, n): """ Returns True if n is in the list of numbers. """ # binary search i_start = 0 i_end = len(numbers) - 1 count = 0 while True: count += 1 if count > 50: return "too many iterations" #print "i_start, i_end = ", i_start, i_end #print "list there is", numbers[i_start], numbers[i_end] i_middle = (i_start + i_end)/2 if n == numbers[i_middle]: return True elif n < numbers[i_middle]: i_end = i_middle - 1 elif n > numbers[i_middle]: i_start = i_middle + 1 else: print "This shouldn't happen" return "?" if i_end < i_start: return False def contains3(numbers, n): """ Returns True if n is in the list of numbers """ # recursive binary search i_start = 0 i_end = len(numbers) - 1 return recursive_contains(numbers, n, i_start, i_end) def recursive_contains(numbers, n, i_start, i_end): if i_end < i_start: return False i_middle = (i_start + i_end)/2 if n < numbers[i_middle]: i_end = i_middle - 1 elif n > numbers[i_middle]: i_start = i_middle + 1 else: return True return recursive_contains(numbers, n, i_start, i_end) def contains4(numbers, n): # recursive binary search # using new arrays (somewhat memory inefficient) if not numbers: return False i_middle = len(numbers)/2 if n < numbers[i_middle]: return contains4(numbers[:i_middle], n) elif n > numbers[i_middle]: return contains4(numbers[i_middle+1:], n) else: return True