递归法实现n阶行列式求值(c语言实现)

递归法实现n阶行列式求值

/*递归实现N阶行列式计算,难点在于二维数组的动态申请*/
#include<stdio.h>
#include<stdlib.h>
int main() {
    double f(int N, int **p);//函数接口,N表示阶数,p为二级指针
    int i, j, num;
    printf("请输入阶数:\n");
    while (scanf("%d", &num) != EOF) {
        printf("请输入行列式:\n");
        int** array = (int**)malloc(sizeof(int*) * num);//申请num个int*存储空间
        for (i = 0; i < num; i++) {
            array[i] = (int*)malloc(sizeof(int) * num);//分配int空间
        }
        for (i = 0; i < num; i++) {
            for (j = 0; j < num; j++)
                scanf("%d", &array[i][j]);
        }                                     //输入行列式
        printf("The result is %.0f\n", f(num, array));//调用函数求解
        printf("请输入阶数:\n");
    }
    return 0;
}
double f(int N, int **p) {
    if (N == 1)
        return p[0][0];
    else if (N == 2)
        return p[0][0] * p[1][1] - p[0][1] * p[1][0];//基线条件的设置,当为一阶二阶时返回二者的结果
    else {                                      //递归开始
        double result = 0;                       //定义result来存储结果
        int i, j, m, k, l, sign = 1,h;                  //i来控制第一行的每一个数据,m和j来进行遍历,k和l来完成余子式的生成
        for (i = 0; i < N; i++) {
            int **tmp = (int**)malloc(sizeof(int*) * (N - 1));//为余子式分配二级指针
            for (h = 0; h < N - 1; h++) {
                tmp[h] = (int*)malloc(sizeof(int) * (N - 1));//分配int空间
            }
            l = 0;
            k = 0;                               //每次循环都置零
            for (m = 1; m < N; m++) {
                for (j = 0; j < N; j++) {
                    if (j == i)
                        continue;                  //越过当前位置列的数,参照展开式
                    else {
                        if (k == N - 1) {           //此条件用于控制换行
                            k = 0;
                            l++;
                        }
                        tmp[l][k++] = p[m][j];
                    }
                }
            }
            result += f(N - 1, tmp) * sign * p[0][i];  //sign用于将余子式变成代数余子式
            for (h = 0; h < N - 1; h++) {
                free(tmp[h]);
            }
            free(tmp);                     //释放空间
            sign = -sign;
        }
        return result;                  //返回结果
    }
}



  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值