我编写了这个程序,它使用递归来计算矩阵的行列式。
函数build_new_matrix
(不是递归的)有问题,因为它改变了变量old_mat
,虽然我看不出原因!
#include <iostream>
#include <cstring>
using namespace std;
int * new_mat = new int[];
int calculate_det_small (int matrix [4]){ //calculate determinant of a 2x2 matrix
int res = ((matrix[0])*(matrix[3]))-((matrix[1])*(matrix[2]));
return res;
};
int * build_new_matrix (int* old_mat, int rows, int minor){ //return the minor of the matrix
int l=0;
for (int i=rows; i<(rows*rows); i++){
cout<<old_mat[i]<<" ";
if ((i-minor) % rows !=0){
new_mat [l] = old_mat[i] ; ///////////////////error!!!!!!!!
l++;
}
};
return new_mat;
};
int calculate_det (int rows, int matrix[]) { //calculate determinant of a bigger matrix
int c,o;
if (rows==2){
return calculate_det_small (matrix);
}
else {
int result=0;
for (int i=0; i<rows;i++){
int* cur_matrix = build_new_matrix(matrix,rows,i);
if (i%2==0){
c = matrix[i];
result+= ((matrix[i])*(calculate_det((rows-1),cur_matrix)));
}
else{
o =matrix[i];
result-= ((matrix[i])*(calculate_det((rows-1),cur_matrix)));
}
};
return result;
}
};
void main(){
int mat[16] = {1,2,3,4,5,6,7,8,9, 10, 11, 12, 10, 14 ,15, 16};
int determinanta = calculate_det(4,mat);
}
答案 0 :(得分:2)
因为,在第一次递归之后,old_mat
指向与全局new_mat
相同的数组;所以写new_mat
会覆盖旧矩阵。如果你打算这样做,你需要在每个递归深度为新矩阵分配内存。
此外,new int[]
没有意义,也不应该编译。您需要指定数组大小。
答案 1 :(得分:0)
int * new_mat = new int[];
这条线毫无意义。您使用零元素分配数组。那甚至可以编译吗?