【发布时间】:2018-03-14 16:15:32
【问题描述】:
下面的代码递归地计算q阶矩阵的行列式。它适用于 q=3 和 q=2 但对于 q=4 它输出垃圾值,每次运行程序时都会改变: 这里出了什么问题?
#include <stdio.h>
#include <math.h>
int det(int q, int arr[q][q]);
int main(void)
{
int arr[4][4] = {
{2,4,9,8},
{6,3,4,5},
{5,7,8,6},
{3,2,5,7}
};
printf("value of determinant is %d\n", det(4, arr));
}
int det(int q, int arr[q][q])
{
if(q>2)
{
int i, j, k, m, n, s[q-1][q-1], d=0, cof;
for(k=-1,i=0,j=0;k<q-1;k++)
{
i=0;j=0;
for(m=1;m<q;m++,i++)
{
n=0;j=0;
for(n,j;n<k+1;n++,j++)
{
s[i][j] = arr[m][n];
}
n=q-1+k;
for(n;n<q;n++,j++)
{
s[i][j] = (arr[m][n]);
}
}
cof = (arr[0][k+1])*(pow(-1,k+1));
d += cof*det(q-1, s);
}
return d;
}
else if(q==2)
{
int d = ((arr[0][0])*(arr[1][1])-(arr[0][1])*(arr[1][0]));
return d;
}
}
【问题讨论】:
-
你使用调试器吗?您是否尝试过使用断点单步执行?问题到底出在哪里?
-
你有没有尝试过basic调试。
-
你为什么要使用递归呢?代码效率太高,可读性太强?为什么你用一个字母给你所有的变量命名?
-
@Lundin:递归是我想到的第一件事,因为当我们取行列式时,我们基本上求和(辅因子*另一个行列式),所以它本质上就像再次调用函数。有没有更好的办法?
-
我对递归没有任何特别的反对——这是构造这个算法的一种自然方式。但是由于(至少)许多无意义的变量名称、空格使用不足、括号使用过多以及变量范围不必要的宽泛,呈现的代码难以阅读。
标签: c arrays recursion determinants