public static int MaxSoFar_Recursion(int[] arr, int l, int u)
{
if (l > u)
{ /* Пустой массив */
return 0;
}
if (l == u)
{ /* 1 элемент */
return Math.Max(0, arr[l]);
}
int m = (l + u) / 2;
/* поиск макс. последовательности
слева от границы: */
int lmax = 0;
int sum = 0;
for (int i = m; i >= l; i--)
{
sum += arr[i];
lmax = Math.Max(lmax, sum);
}
/* поиск макс. последовательности
справа от границы: */
int rmax = sum = 0;
for (int i = m + 1; i <= u; i++)
{
sum += arr[i];
rmax = Math.Max(rmax, sum);
}
return Math.Max(Math.Max(lmax + rmax,
MaxSoFar.MaxSoFar_Recursion(arr, l, m)),
MaxSoFar.MaxSoFar_Recursion(arr, m + 1, u));
}
// Вызывается в виде:
<object>.MaxSoFar_Recursion(myarr, 0, myarr.Length - 1);