我是编程的新手,我正在寻找一种方法来找到矩阵的行列式。我在网上找到了这个代码,但是我无法理解这里的算法。我对递归的基础没有问题,但是继续和主循环我很难理解。非常感谢任何能向我解释算法的人。
int determ(int a[MAX][MAX],int n) {
int det=0, p, h, k, i, j, temp[MAX][MAX];
if(n==1) {
return a[0][0];
} else if(n==2) {
det=(a[0][0]*a[1][1]-a[0][1]*a[1][0]);
return det;
} else {
for(p=0;p<n;p++) {
h = 0;
k = 0;
for(i=1;i<n;i++) {
for( j=0;j<n;j++) {
if(j==p) {
continue;
}
temp[h][k] = a[i][j];
k++;
if(k==n-1) {
h++;
k = 0;
}
}
}
det=det+a[0][p]*pow(-1,p)*determ(temp,n-1);
}
return det;
}
}
答案 0 :(得分:7)
该算法使用分而治之的方法来解决问题(找到N * N矩阵的行列式)。
该算法使用递归模式,这是一种分而治之的方法。您可以通过注意算法在第三个条件语句中调用自身来找到它。
每个递归算法都有一个退出条件,这是代码中的第一个if语句。它们还包含一个部分,它解决了最方便的问题,或者首先难以解决的主要问题的原子问题。可以轻松解决原子问题或分歧最大的问题,因为您可以看到代码的第二个if语句。在你的情况下,它实际上解决了2 * 2矩阵的行列式。
你的代码最重要的部分是理解哪个部分也有挑战性的部分(你也是递归的!)。 这部分也是征服的关键。通过做一些回溯和数值示例,您可以找到它:
det = det + a[0][p] * pow(-1,p) * determ(temp,n-1);
对于最终建议,请尝试一个只需要一次划分的3 * 3矩阵。 祝你好运。
This book is a great one to start studying and understanding algorithms
答案 1 :(得分:0)
#include <iostream>
using std::cin;
using std::cout;
using std::endl;
int **submatrix(int **matrix, unsigned int n, unsigned int x, unsigned int y) {
int **submatrix = new int *[n - 1];
int subi = 0;
for (int i = 0; i < n; i++) {
submatrix[subi] = new int[n - 1];
int subj = 0;
if (i == y) {
continue;
}
for (int j = 0; j < n; j++) {
if (j == x) {
continue;
}
submatrix[subi][subj] = matrix[i][j];
subj++;
}
subi++;
}
return submatrix;
}
int determinant(int **matrix, unsigned int n) {
int det = 0;
if (n == 2) {
return matrix[0][0] * matrix[1][1] - matrix[1][0] * matrix[0][1];
}
for (int x = 0; x < n; ++x) {
det += ((x % 2 == 0 ? 1 : -1) * matrix[0][x] * determinant(submatrix(matrix, n, x, 0), n - 1));
}
return det;
}
int main() {
int n;
cin >> n;
int **matrix = new int *[n];
for (int i = 0; i < n; ++i) {
matrix[i] = new int[n];
for (int j = 0; j < n; ++j) {
cin >> matrix[i][j];
}
}
cout << determinant(matrix, n);
return 0;
}