Rekurencyjne obliczanie wyznacznika

0
 
double det(int n, double *res, double A[][n]) {
    int i, j, k, l, m, mult;
    double B[n - 1][n - 1];
    
    if (n == 1)
        return *res += A[0][0];
    else {
        for (i = 0; i < n; ++i) { /*rozwinięcie Laplace'a zawsze względem 1 kolumny*/
			
            if (i % 2)
                mult = 1;
            else
                mult = -1;
            
            l = 0;
            for (j = 0; j < n - 1; ++j) { /*B - podmacierz powstała z wykreślenia 1 kolumny i i-tego wiersza*/
			m = 1;
			if (l == i)
				++l;
			for (k = 0; k < n - 1; ++k) {
                	        B[j][k] = A[l][m]; 
			        ++m;
			}
			++l;
	    }
            
            return *res += A[i][0] * mult * det(n - 1, res, B);           
        }
    }
}

Mam problem z powyższym kodem, w zamierzeniu miał on obliczać wyznacznik korzystając z rozwinięcia Laplace'a, ale wynik, który otrzymuję dla n > 2 jest błędny. Byłbym bardzo wdzięczny jeśli ktoś wskazałby mi błąd w rozumowaniu, męczę się już z tym kodem jakiś czas.

0

Return powinien być poza pętlą for i pod return nie powinno być żadnych obliczen.
Po co ci argument res?

0

Żeby przekazać 'na dół' wyliczoną już sumę, jeśli miałeś na myśli coś takiego:

 
double det(int n, double *res, double A[][n]) {
    int i, j, k, l, m, mult;
    double B[n - 1][n - 1];
 
    if (n == 1)
        return *res += A[0][0];
    else {
        for (i = 0; i < n; ++i) { /*rozwinięcie Laplace'a zawsze względem 1 kolumny*/
 
            if (i % 2)
                mult = 1;
            else
                mult = -1;
 
            l = 0;
            for (j = 0; j < n - 1; ++j) { /*B - podmacierz powstała z wykreślenia 1 kolumny i i-tego wiersza*/
                        m = 1;
                        if (l == i)
                                ++l;
                        for (k = 0; k < n - 1; ++k) {
                                B[j][k] = A[l][m]; 
                                ++m;
                        }
                        ++l;
            }
 
            *res += A[i][0] * mult * det(n - 1, res, B);           
        }
        return res;
    }
}
 

to niestety dalej zwraca błędny ( choć inny ) wynik.

0

Algorytm polega na tym że wykreślasz pierwszą kolumnę oraz i-ty wiersz, zaś numer tego i-go wiersza nie jest przekazywany do rekurencyjnego wywołania.
W skrócie - realizacja algorytmu jest niepoprawna.

1 użytkowników online, w tym zalogowanych: 0, gości: 1