递归求解行列式

晚上朋友说写个行列式程序,就兴致勃勃地写了下来,给大家参考。

行列式:
行列式在数学中,是一个函数,其定义域为det的矩阵A,取值为一个标量,写作det(A)或 | A | 。
行列式的计算参见《线性代数》教材。
这里要强调的是:行列式所组成的矩阵必定是个方阵,也就是说其所成矩阵的行数等于列数。

除去化简行列式为上下三角行列式的方法之外,由行列式的手工朴素解法(模拟),易得求解行列式可以使用递归的方法来求解,将大矩阵不断分解为小矩阵来缩小其规模,最后逐层返回答案。

#include <iostream>
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<<determinant(n,a)<<endl;
    return 0;
}

运行实例:

在这里插入图片描述
upd: 只是需要计算或验证行列式的同学,你可以直接下载可执行程序食用。
exe可执行文件下载地址:
链接: https://pan.baidu.com/s/1lcQfDNWLskQMiuClg5HGpw 提取码: d8mm

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值