# Compute maximum sum of subarray (Kadane's algorithm) in purely functional immutable Scala

## Algorithm goal

Find the maximum sum of a sub-sequence of an array. This problem is known as 'MaxSliceSum' on Codility.

If we have an array like '[1, 2, -3, 4, -5]', the maximum sum of a subarray is 4, that of ''.

## Explanation

### The mathematics

We need to break the problem down into parts: if we have a sequence $$[a,b,c]$$, by brute-force, we would need to look through $$[a]$$, $$[b]$$, $$[c]$$, $$[a,b]$$, $$[b,c]$$, and $$[a,b,c]$$. However, if we had computed $$[a,b]$$, computing $$[a,b,c]$$ from scratch would be redundant (as we have to do many summations more than once) and here we see a possibility of optimisation.

How do we split it into parts? If we define the result $$M_e$$ to be the maximum sum of subarray ending at position $$e$$, then $$M_{e+1}$$ is either that, plus the value $$V_{e+1}$$ at position $$e+1$$, or it is the new value $$V_{e+1}$$. (this is © from www.scala-algorithms.com)

This leads to a formula $$M_{e+1} = \max\{ M_e, M_e + V_{e+1}\}$$, and now that we have the list of maximum subarrays ending at position $$e$$, we can find the maximum value from those items.

### The code

Once you understand the mathematics, the solution becomes quite straightforward.

## Test cases in Scala

assert(
computeForArrayClearKadane(Array[Int](-2, 1, -3, 4, -1, 2, 1, -5, 4)) == 6
)
assert(computeForArrayClearKadane(Array(1, 2, -3, 4, -5)) == 4)

def computeForArrayClearKadane(array: Array[Int]): Int = ???