递归求解行列式
晚上朋友说写个行列式程序,就兴致勃勃地写了下来,给大家参考。
行列式:
行列式在数学中,是一个函数,其定义域为det的矩阵A,取值为一个标量,写作det(A)或 | A | 。
行列式的计算参见《线性代数》教材。
这里要强调的是:行列式所组成的矩阵必定是个方阵,也就是说其所成矩阵的行数等于列数。
除去化简行列式为上下三角行列式的方法之外,由行列式的手工朴素解法(模拟),易得求解行列式可以使用递归的方法来求解,将大矩阵不断分解为小矩阵来缩小其规模,最后逐层返回答案。
#include
using namespace std;
int determinant(int S,int a[][11]) {//传入参数,S代表当前行列式的阶数,a代表代数余子式所成矩阵
if(S == 2) {
return a[1][1]*a[2][2]-a[2][1]*a[1][2];
//到达边界,如果当前阶数为2,那么主对角线乘积减去副对角线乘积即可return
}
int tmp[11][11],ans=0;
//tmp用于储存代数余子式所成矩阵,ans就是最后要返回的结果
int row=1,col=1;
for(int k=1;
k<=S;
k++) {//遍历第一行元素,这是第一个乘因子
for(int i=2;
i<=S;
i++) {
for(int j=1;
j<=S;
j++) {//这两层循环用于求代数余子式所成矩阵
if(j==k)continue;
//如果当前元素刚好是被“划”掉的,那么不做任何操作
else {
tmp[row][col++]=a[i][j];
//构造tmp数组
if(col==S) {//如果到达行末了,记得换行,列数置1
col=1;
row++;
}
}
}
}
ans += ((k+1)%2==0? 1: -1)* a[1][k]*determinant(S-1,tmp);
//控制正负,递归求解
row=col=1;
//递归过程决定接下来要构造新矩阵,所以这里一定一定要记得置1
}
return ans;
//最后把答案返回
}
int main()
{
int a[11][11];
int n;
cin>>n;
//输入行列式的阶数
for(int i=1;
i<=n;
i++) {
for(int j=1;
j<=n;
j++) {
cin>>a[i][j];
//按顺序输入数据
}
}
cout<
运行实例:
【递归求解行列式】
文章图片
upd: 只是需要计算或验证行列式的同学,你可以直接下载可执行程序食用。
exe可执行文件下载地址:
链接: https://pan.baidu.com/s/1lcQfDNWLskQMiuClg5HGpw 提取码: d8mm
推荐阅读
- 动态规划|暴力递归经典问题
- 基础课|使用深度优先搜索(DFS)、广度优先搜索(BFS)、A* 搜索算法求解 (n^2 -1) 数码难题,耗时与内存占用(时空复杂度)对比(附((n^2 - 1) 数码问题控
- 用栈来求解汉诺塔问题
- 从|从 最具启发性的汉诺塔问题开始 聊递归
- Leetcode|Leetcode 题解系列 -- 对称二叉树(递归)
- 二叉树递归套路(4)(最低公共祖先、派对的最大快乐值)
- 二叉树递归套路(3)(判断是否是满二叉树、最大子搜索二叉树的节点数)
- 二叉树递归套路(2)(判断二叉树是否是搜索二叉树、二叉树的最大距离)
- 二叉树递归套路(判断二叉树是否是完全二叉树、判断二叉树是否是平衡二叉树)
- Python求解谷歌高速公路招聘广告({|Python求解谷歌高速公路招聘广告:{ 无理数e中前十位连续的素数 }.com)