# run using python fibonacci_search.py -v """ @params arr: input array val: the value to be searched output: the index of element in the array or -1 if not found return 0 if input array is empty """ def fibonacci_search(arr, val): """ >>> fibonacci_search([1,6,7,0,0,0], 6) 1 >>> fibonacci_search([1,-1, 5, 2, 9], 10) -1 >>> fibonacci_search([], 9) 0 """ fib_N_2 = 0 fib_N_1 = 1 fibNext = fib_N_1 + fib_N_2 length = len(arr) if length == 0: return 0 while fibNext < len(arr): fib_N_2 = fib_N_1 fib_N_1 = fibNext fibNext = fib_N_1 + fib_N_2 index = -1 while fibNext > 1: i = min(index + fib_N_2, (length - 1)) if arr[i] < val: fibNext = fib_N_1 fib_N_1 = fib_N_2 fib_N_2 = fibNext - fib_N_1 index = i elif arr[i] > val: fibNext = fib_N_2 fib_N_1 = fib_N_1 - fib_N_2 fib_N_2 = fibNext - fib_N_1 else: return i if (fib_N_1 and index < length - 1) and (arr[index + 1] == val): return index + 1 return -1 if __name__ == "__main__": import doctest doctest.testmod()