Dobrý den,
mám vytvořit program, který bude pro matici
| 1 2 3 4 5 |
| 6 7 8 9 0 |
| 2 3 4 5 1 |
| 7 8 9 0 6 |
| 5 3 2 1 4 |
počítat její hodnotu a to takto:
f(M) = 1*f(M1) + 7*f(M2) + 4*f(M3) + 0*f(M4) + 4*f(M5)
v případě, že matice bude 0x0, nebo 1x1 bude rekurze vracet 0, pokud 2x2, tak hodnotu prvků na hlavní-vedlejší diagonále.
Můj kód vypadá takto:
int main()
{
int n;
printf("Zadej rozmer matice:");
scanf("%d",&n);
//osetreni vstupu
if ( n < 0 )
{
printf("Spatne zadany rozmer.");
return -1;
}
int mat[n][n];
int p;
nullMat(n,mat); //nulovani matice
scanMat(n,mat); //nacitani matice
//print(n,mat);
//volani rekurzivni funkce
printf("Funkce ma hodnotu: %d\n",rekurze(n,mat));
return 0;
}
Funkce pro 2x2:
int dvaMat(int n, int mat[n][n])
{
int soucinh = 1;
int soucinv = 1;
for( int i = (n-2); i < n; i++)
{
for( int j = (n-2); j < n; j++)
{
if( i == j) soucinh *= mat[i][j];
if( (i == 1 && j == 0) || (i == 0 && j == 1))soucinv *=mat[i][j];
}
}
return (soucinh-soucinv);
}
A funkce rekurzivni:
int rekurze(int n, int mat[n][n])
{
int soucin = 0;
if( n <= 1) return 0;
if( n == 2) return dvaMat(n,mat);
for( int i = 0; i < n; i++)
{
int subMat[n-1][n-1];
for(int k = 0; k < n; k++)
{
for(int j = 0; j < n; j++)
{
subMat[k][j] = mat[k+1][j+1];
}
}
soucin += mat[i][i] * rekurze((n-k-1), subMat);
}
return soucin;
}
Bohužel mi tento algoritmus funguje pro matice 3x3, kdy je jen jedno "dělení" submatice, ale pro větší už nepočítá správně, nedaří se mi nějak uchovat výsledek rekurzivního součtu matice n-1.
Poradili byste? Děkuji