0
#include<iostream.h>
#include<conio.h>
#include<math.h>

double Det (double a[2][2], int size);
void form(double a[2][2], int c, int size);

double b[2][2];

double Det(double a[2][2], int size) {
  if (size==1) {
    return a[0][0];
  }
  else {
    double ans = 0.0;
    int c;
    for (c=0;c<size;c++) {
      form(a,c,size);
      ans += pow(-1.0,(double)c)*Det(b,size-1);
    }
    return ans;
  }
}

void form(double a[2][2], int c, int size) {
  int i,j=0,k,l=0;
  for (i=0;i<size;i++) {
    for (j=0;j<size;j++) {
      if ((i!=0)&&(j!=c)) {
        if (l==size-1) {
           k++;
           l=0;
        }
        b[k][l]=a[i][j];
        l++;
      }
    }
  }
}

int main() {
    double mat[2][2] = {{1.0,2.0},{3.0,7.0}};
    cout << Det(mat,2);
    getch();
    return 0 ;
}

我正在用 C++ 编写一个程序来使用递归计算矩阵的行列式。我知道有很多更好的算法可以做同样的事情。但是,我被要求实施这个。作为测试用例,我使用了代码中指定的矩阵。当我运行这段代码时,我得到的答案是 -4 而不是 1。我不明白这段代码有什么问题。有人可以帮忙吗?提前致谢。

4

1 回答 1

0

您在代码中犯了几个错误,请使用下面的错误

#include<iostream>
#include<math.h>
using namespace std;
double Det (double a[2][2], int size);
void form(double a[2][2], int c, int size);
double b[2][2];
double Det(double a[2][2], int size)
{
  if(size==1)
    return a[0][0];
  else
  {
    double ans=0.0;
    int c;
    for(c=0;c<size;c++)
    {
      form(a,c,size);
      ans+=pow(-1.0,(double)c) * a[0][c] * Det(b,size-1);
    }
    return ans;
  }
}
void form(double a[2][2], int c, int size)
{
  int i,j=0,k = 0,l=0;
  for(i=0;i<size;i++)
  {
    for(j=0;j<size;j++)
    {
      if((i!=0)&&(j!=c))
      {
        if(l==size-1)
        {
           k++;
           l=0;
        }
        b[k][l]=a[i][j];
        l++;
      }
    }
  }
}
int main()
{
    double mat[2][2]={{1.0,2.0},{3.0,7.0}};
    cout<<Det(mat,2);
    return 0 ;
}

这给你1。错误,你忘记初始化k为 0,你忘记了乘法a[0][c]

于 2013-09-24T16:54:25.877 回答