import sys

def rec_seq_up( N ):
    if N < 0:
        return
    print( N, end = ' ' )
    rec_seq_up( N-1 )

def rec_seq_down( N ):
    if N < 0:
        return
    rec_seq_down( N-1 )
    print( N, end = ' ' )

def rec_seq_downup( N ):
    if N < 0:
        return
    print( N, end = ' ' )
    rec_seq_downup( N-1 )
    print( N, end = ' ' )

def rec_seq_updown( N, currentVal ):
    if currentVal > N :
        return
    print( currentVal, end = ' ' )
    rec_seq_updown( N, currentVal+1 )
    print( currentVal, end = ' ' )

def rec_max( arr ):
    if len(arr) == 1:
        return arr[0]
    maxrest = rec_max( arr[1:] )
    return max( arr[0], maxrest )

def rec_isSorted( arr ):
    if len(arr) == 1:
        return True
    sortedRest = rec_isSorted( arr[1:] )
    return arr[0] <= arr[1] and sortedRest

def rec_multiply( x, y ):
    if y == 1:
        return x
    return x + rec_multiply( x, y-1 )

def rec_reverse( arr ):
    if len(arr) <= 1:
        return arr
    reversed = rec_reverse( arr[1:] )
    return reversed.append( arr[0] )

def rec_sum( arr ):
    if len(arr) == 0:
        return 0
    return arr[0] + rec_sum( arr[1:] )



rec_seq_up( 11 )
print()
rec_seq_down( 11 )
print()
rec_seq_downup( 11 )
print()
rec_seq_updown( 11, 0 )
print()

arr = [ 2, 5, 1, 5, 2, 8, 4, 2, 6, 3 ]
print( rec_max( arr, 0, len(arr) ) )

print( rec_isSorted( arr, 0, len(arr) ) )

arr2 = [ 2, 5, 11, 15, 22, 28, 34, 34, 46, 53 ]
print( rec_isSorted( arr2, 0, len(arr2) ) )

print( rec_reverse(arr2) )


# --- beware of system stack size - possible overflow.
print( rec_multiply( 10, 14 ) )
#print( rec_multiply( 100, 1000 ) )
sys.setrecursionlimit(10000)
print( rec_multiply( 100, 5000 ) )
#sys.setrecursionlimit( 100 )
print( rec_multiply( 100, 5000 ) )









