Что не так в этой рекурсии?
Что не так в этой рекурсии?
Она выглядит непонятно. Её можно переписать понятно так:int mul(const int *x, int n)
{
    assert(n > 0);
    if (n == 1)
        return x[0];
    if (n == 2)
        return x[0] * x[1];
    return mul(x, n / 2) * mul(x + n / 2, n - n / 2);
}
Правильный вариант функции:int mul(int * arr, int N, int shift = 0)
{
    switch (N)
    {
        case 1:
            return arr[shift];
        break;

        case 2:
            return (arr[shift] * arr[shift + 1]);
        break;

        default:
            int M = N / 2;
            return (mul(arr, M, shift) * mul(arr, N - M, shift + M));
    }
}
В вашей функции последние три строки выполняются всегда, вне зависимости от длины массива. Поэтому происходит выход за границы массива.