(1)原理重述如下:
(2)遞歸實現如下:
#include<iostream> #include<cstdlib> using namespace std; double det(int n, double *Mat) { if (n == 1) return Mat[0]; double *subMat = new double[(n - 1)*(n - 1)];//創建n-1階的代數餘子式陣subMat int mov = 0;//判斷行是否移動 double sum = 0.0;//sum為行列式的值 for (int Matrow = 0; Matrow<n; Matrow++) // Mat的行數把矩陣Mat(nn)賦值到subMat(n-1) { for (int subMatrow = 0; subMatrow<n - 1; subMatrow++)//把Mat陣第一列各元素的代數餘子式存到subMat { mov = Matrow > subMatrow ? 0 : 1; //subMat中小於Matrow的行,同行賦值,等於的錯過,大於的加一 for (int j = 0; j<n - 1; j++) //從Mat的第二列賦值到第n列 { subMat[subMatrow*(n - 1) + j] = Mat[(subMatrow + mov)*n + j + 1]; } } int flag = (Matrow % 2 == 0 ? 1 : -1);//因為列數為0,所以行數是偶數時候,代數餘子式為1. sum += flag* Mat[Matrow*n] * det(n - 1, subMat);//Mat第一列各元素與其代數餘子式積的和即為行列式 } delete[]subMat; return sum; } int main() { int n;//階數 cout<<"輸入階數:"<<endl; cin >> n;//讀入階數 double *Mat = new double[n*n];//動態分配Mat大小 cout << "輸入矩陣:" << endl; for (int i = 0; i < n*n; i++) cin >> Mat[i]; cout << "行列式為:" << endl; cout << det(n, Mat) << endl; delete[]Mat;//釋放 system("pause"); return 0; }
推薦閱讀: