Вы не возвращаете значение для всех путей кода, что в конечном итоге приведет к неопределенному поведению при использовании возвращаемого значения, которое никогда не существовало.
(Довольно современный компилятор должен предупредить вас об этом.)
Вы должны возвращать определитель из рекурсий вместо того, чтобы мутировать глобальное изменяющееся состояние, и рекурсия обычно только приводит к проблемам.
(Это также делает ваш код намного более похожим на математическое определение определителя, что, в свою очередь, делает его более легким для понимания и проверки.)
С некоторыми незначительными изменениями я бы предложил что-то вроде
int det(const vector<vector<int>> &A)
{
if (A.size() != A[0].size()){
cout << "Determinant Error: non-square matrix. \n";
return 0;
}
if (A.size() == 2)
{
return A[0][0] * A[1][1] - A[0][1] * A[1][0];
}
else
{
int determinant = 0;
int sign = -1;
for (int i = 0; i < A.size(); i++){
vector<vector<int>> submatrix = extractNext(A, 0, i);
sign = -sign;
int cofactor = sign * A[0][i];
for (int j = 0; j < submatrix.size(); j++){
submatrix[0][j] = cofactor * submatrix[0][j];
}
determinant += det(submatrix);
}
return determinant;
}
}