计算n阶行列式实现原理:拉普拉斯展开式。
分析:我们分析拉普拉斯展开式会发现,这个就是一个递归的过程,因为它存在最小子项。
c++ 版代码语言:javascript复制#include
using namespace std;
// 每次进来的余子项是不断变小的 然后行数k也是不断变小的
vector
{
vector
for (int i = 1; i < arr.size(); ++i) // 根据拉普拉斯定理,这里是从行列式的第二行开始
{
vector
for (int j = 0; j < arr[0].size(); ++ j)
{
// 根据拉普拉斯公式,会在生成子矩阵的时候,会过滤掉列号相同的,这里的k就是列号
if (j == k) continue;
t.push_back(arr[i][j]);
}
tmp.push_back(t);
}
return tmp;
}
int func(vector
{
int res = 0;
// 当行列式的n为1的时候,那么就是直接放回这个行列式的值
if (n == 1) return arr[0][0];
// 如果n为2的时候 就是交叉相乘再相减
else if (n == 2) return arr[0][0] * arr[1][1] - arr[0][1] * arr[1][0];
else
{
// 然后就是剩下的情况,很显然这是用的递归的思路来做的
for (int i = 0; i < n; i ++) res += pow(-1, i) * arr[0][i] * func(surplus(arr, i), n - 1);
} // surplus函数就是计算余子式的
return res;
}
int main()
{
int n;
vector
cout << "请输入你要计算的行列式的行数:";
cin >> n;
for (int i = 0; i < n; i ++)
{
cout << "第" << i + 1 << "行:";
vector
for (int j = 0; j < n; j ++)
{
int t;
cin >> t;
tmp.push_back(t);
}
arr.push_back(tmp);
}
int res = 0;
res = func(arr, n);
cout << res << endl;
return 0;
}JAVA版代码语言:javascript复制import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int n = Integer.parseInt(scanner.nextLine());
int[][] arr = new int[n][n];
for (int i = 0; i < n; i++) {
String[] s = scanner.nextLine().split(" ");
for (int j = 0; j < n; j++) {
arr[i][j] = Integer.parseInt(s[j]);
}
}
int res;
res = function(arr, n);
System.out.println(res);
}
//递归函数
private static int function(int[][] arr, int n) {
int res=0;
if (n==1){
return arr[0][0];
}else if (n==2){
//递归终止条件
return arr[0][0]*arr[1][1]-arr[0][1]*arr[1][0];
}else {
//递归
for (int i=0;i res+=Math.pow(-1,i)*arr[0][i]*function(yuzishi(i,arr),n-1); } } return res; } //得到对应的余子式 private static int[][] yuzishi(int i,int[][] arr){ int[][] temp=new int[10][10]; for (int k=1;k for (int j=0,y=0;j if (j==i){ continue; } temp[k-1][y++]=arr[k][j]; } } return temp; } }Python 版代码语言:javascript复制import math def surplus(arr, k, n): temp = [[0] * n for i in range(n)] for i in range(1, n): t = 0 for j in range(n): if (j == k): continue temp[i - 1][t] = arr[i][j] t += 1 return temp def func(arr, n): if (n == 1): return arr[0][0] elif (n == 2): return arr[0][0] * arr[1][1] - arr[0][1] * arr[1][0] else: res = 0 for i in range(n): res += math.pow(-1, i) * arr[0][i] * func(surplus(arr, i, n), n - 1) return res n = int(input()) s = [0] * n for i in range(n): t = list(map(int, input().split())) s[i] = t res = func(s, n) print(res)