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 )

random.seed(66002663)

N = 1000000
#N = 20
a = [ random.randint(1,9999999) for i in range(N) ]

if len(a) < 30:  print(a)

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) );




