Cześć,

Chodzi o obliczanie wyznacznika metodą Laplance'a korzystając z rekurencji i to właśnie gdzieś przy niej mi coś nie hula.
Nie mogę za cholerę zlokalizować co jest nie tak więc postanowiłem ruszyć na forum.
Dla testowej macierzy:

1 2
3 4

zwraca mi wynik -3
Siedziałem trochę i debugowałem program i zauważyłem, że funkcja wywołuje samą siebie dwukrotnie, a powinna przecież tylko raz bo po pierwszym wywołaniu już podmacierz ma tylko 1 element.
Wygląda to tak, że wywoływana jest funkcja obliczająca macierz po raz pierwszy w main, następnie wywołuje samą siebie w tej linijce:

det += mul * matrix[subMatrixRow][columnsVector[i]] * determinant(sizeMatrix - 1, subMatrixRow + 1, columnsVectorToCalc, matrix);

Po wywołaniu, det = 4, następnie program dochodzi do if'a no i wykonuje:

return matrix[subMatrixRow][0];

po czym

det = 3

no i później zmienia się mnożnik na -1 i program jeszcze raz wykonuje funkcję, znowu zwraca 3, mnoży prze wartość -1</code> i mam <code>-3.
Nie wiem co jest nie tak.

#include <iostream>

using namespace std;

//wyznacznik macierzy, deklaracja
int determinant(int **matrix, int sizeMatrix, int *columnsVector, int subMatrixRow);

int main(){

    int sizeMatrix = 0;     //rozmiar macierzy
    int var = 0;


    cout << "Podaj stopien macierzy: " << endl;
    cin >> sizeMatrix;

    int **matrix = new int *[sizeMatrix];       //dynamiczna alokacja miejsca na macierz

    //for(int i = 0; i < sizeMatrix; i++)


    //uzupelniamy macierz zmiennymi wprowadzonymi z klawiatury
    cout << "Uzupelnianie macierzy" << endl;
    for(int row = 0; row < sizeMatrix; row++){
            matrix[row] = new int[sizeMatrix];        //tworzymy macierz o wybranym rozmiarze
        for(int column = 0; column < sizeMatrix; column++){
            cin >> matrix[row][column];
        }
    }

    int *columnsVector = new int[sizeMatrix];   //wektor kolumn w macierzy

    for(int i = 0; i < sizeMatrix; i++)     //wypelniamy go numerami kolumn
        columnsVector[i] = i;

    cout << "Wyznacznik to: " << determinant(matrix, sizeMatrix, columnsVector, 0) << endl;

    //zwalniamy pamiec
    delete [] columnsVector;

    for(int i = 0; i < sizeMatrix; i++)
        delete [] matrix[i];

    delete [] matrix;


    return 0;
}

int determinant(int **matrix, int sizeMatrix, int *columnsVector, int subMatrixRow){

    int *columnsVectorToCalc;   //wektor kolumn z wykreslona kolumna, do obliczen
    int det;    //wyznacznik
    int mul = 1;    //mnoznik
    int colVector = 0; //wektor kolumny ktora pominiemy


    if(sizeMatrix == 1){
        //jezeli macierz ma tylko jeden element to on jest jej wyznacznikiem
        return matrix[subMatrixRow][0];
    }
    else{
        columnsVectorToCalc = new int[sizeMatrix - 1];
        det = 0;

        for(int i = 0; i < sizeMatrix; i++){
            for(int j = 0; j < sizeMatrix - 1; j++){
                if(colVector == i)          //jezeli rowne to pomijamy biezaca kolumne
                    colVector++;

                columnsVectorToCalc[j] = columnsVector[colVector++];        //a tu wrzucamy reszte
            }

            det += mul * matrix[subMatrixRow][columnsVector[i]] * determinant(matrix, sizeMatrix - 1, columnsVectorToCalc, subMatrixRow + 1);

            mul = -mul;
        }

        delete [] columnsVectorToCalc;

        return det;
    }