import random
import time

def rec_max( arr ):
    if len(arr) == 1:
        return arr[0]
    maxrest = rec_max( arr[1:] )
    return max( arr[0], maxrest )

def rec_max2( arr, indexFrom ):
    if indexFrom == len(arr) - 1:
        return arr[indexFrom]
    maxrest = rec_max2( arr, indexFrom+1 )
    return max( arr[indexFrom], maxrest )

def rec_max_bin( arr ):
    if len( arr )== 1:
        return arr[0]
    halflen = len( arr ) // 2
    leftmax  = rec_max_bin( arr[:halflen] )
    rightmax = rec_max_bin( arr[halflen:] )
    return max( leftmax, rightmax )

def rec_max_bin2( arr, low, high ):
    if low+1 == high:
        return arr[low]
    mid = (low+high) // 2
    leftmax  = rec_max_bin2( arr, low,  mid )
    rightmax = rec_max_bin2( arr, mid, high )
    return max( leftmax, rightmax )
# --------------------------------------------------------
#           M  A  I  N
# --------------------------------------------------------

random.seed(6602463)

N = 15
a = [ random.randint(1,99) for i in range(N) ]

N = 100000
a = [ random.randint(1,9999999) for i in range(N) ]

if len(a) < 30:  print(a)

# the recursion depth in python is usually 1000 levels by default
# to change it (double in this case) use e.g.
#   sys.setrecursionlimit( 2000 )
# and do not forget to:  import sys

t1 = time.time()
m1 = 0
if len(a) < 1000: m1 = rec_max( a )
t2 = time.time()

m2 = 0
if len(a) < 1000: m2 = rec_max2( a, 0 )
t3 = time.time()

m3 = rec_max_bin( a )
t4 = time.time()

m4 = rec_max_bin2( a, 0, len(a) )
t5 = time.time()

print( "maximum:", m1, m2, m3, m4 )
print(" times: " )
print( "%6.3f" % (t2-t1) );
print( "%6.3f" % (t3-t2) );
print( "%6.3f" % (t4-t3) );
print( "%6.3f" % (t5-t4) );




