递归法实现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; //返回结果
}
}