C:递归计算矩阵行列式的程序

时间:2015-11-04 02:18:11

标签: c

我正在尝试制作这个程序,但是它没有工作,它没有为辅助矩阵的第二行提供值,我不明白为什么,任何人都可以帮助我吗?谢谢!

哦,我已经推出了一些调试线,显然,一切都很好,它只是没有归因于价值。

#include <stdio.h>
#include <math.h>

void zerar(int n,int m[][n]) {
    int i, j;
    for (i=0; i<n; i++) {
        for (j=0; j<n; j++) {
            m[i][j] = 0;
        }
    }
}

void printm(int n, int matriz[][n]) {
    int i,j;
    for (i=0; i<n; i++) {
        for (j=0; j<n; j++) {
            printf("\t%d", matriz[i][j]);
        }
        printf("\n");
    }
}

int det(int n, int m[][n]) {
    int i, j, k, x, y, soma=0, aux[n][n];
    zerar(n, aux);
    if (n < 1) {}
    else if (n == 1) {
        return m[0][0];
    }
    else if (n == 2) {
        soma = (m[0][0] * m[1][1]) - (m[0][1] * m[1][0]);
        return soma;
    }
    else {
        for (i=0; i<n; i++) {
            for (j=1, x=0; j<n; j++) {
                for (k=0, y=0; k<n; k++) {
                    if (k == i) {
                        continue;
                    }
                    else {
                        printf("\n\n");
                        printf("\nx=%d, y=%d, j=%d, k=%d, i=%d\n", x, y, j, k, i);
                        aux[x][y] = m[j][k];
                        printm(n-1, aux);
                        y++;
                    }
                }
                x++;
            }
            soma += m[0][i]*pow(-1, i+2)*det(n-1, aux);
        }
        return soma;
    }
}


int main()
{
    int m[3][3] = {{4, 3, 2}, {1, 4, 5}, {2, 1, 2}};
    det(3, m);
    printf("%d", det(3, m));
    printf("\n\n");
    printm(3, m);
    printf("\n\n");
}

1 个答案:

答案 0 :(得分:1)

当输入矩阵的大小为n x n时,辅助矩阵的大小aux必须为n-1 x n-1

更改

int i, j, k, x, y, soma=0, aux[n][n];

int i, j, k, x, y, soma=0, aux[n-1][n-1];

你在评论中说:

  

有人可以解释一下,为什么必须这样?

如果您使用aux[n][n]n为3,则对象的内存布局为:

+---+---+---+---+---+---+---+---+---+
|   |   |   |   |   |   |   |   |   |
+---+---+---+---+---+---+---+---+---+

并将数据填充为2 x 2矩阵。

0           1           2
+---+---+---+---+---+---+---+---+---+
| x | x |   | x | x |   |   |   |   |
+---+---+---+---+---+---+---+---+---+

在下一个递归调用中,您将该内存视为2 x 2数组。

0       1              
+---+---+---+---+---+---+---+---+---+
| x | x |   | x | x |   |   |   |   |
+---+---+---+---+---+---+---+---+---+
         ^        ^
         |        Ignored
         Using uninitialized array element

理论上,如果您使用aux[n][n]代替aux[n-1][n-1],则该程序会受到未定义的行为。

相关问题