递归实现矩阵行列式计算程序返回0问题求助
问题分析与修复方案
你的行列式计算程序始终返回0,是因为存在几个关键错误,逐一修正如下:
1. 变量类型不匹配
wyznacznik被声明为int类型,但矩阵元素是float,递归计算的子行列式也是float类型,累加时会强制转换为整数,直接导致精度丢失甚至错误结果。将其改为float类型:
float wyznacznik = 0;
2. 子矩阵指针未重置
每次构建完子矩阵后,podmacierz指针已经移动到分配内存的末尾,递归调用时传入的是无效的末尾指针,子矩阵数据完全错误。需要保存子矩阵的起始地址,每次构建前重置指针,同时记得释放内存避免泄漏:
float *podmacierz_start = podmacierz; // 保存子矩阵起始地址 // ... 构建子矩阵的代码 ... // 递归调用时传入起始地址 wyznacznik += macierz[element_S]*( element_S % 2 ? -1: 1)* wznmacierz(podmacierz_start, rozmiar-1); podmacierz = podmacierz_start; // 重置指针,为下一次构建子矩阵做准备 free(podmacierz_start); // 释放子矩阵内存
3. 打印格式错误
printf使用%d格式符打印float类型的返回值,会导致输出格式混乱。改成%f:
printf("%f", wznmacierz(a,2));
4. 主函数不符合标准
void main不是C标准的主函数写法,应改为int main()并返回0:
int main() { float a[2][2]={{1,3},{9,8}}; printf("%f", wznmacierz(a,2)); return 0; }
修复后的完整代码
#include<stdio.h> #include<stdlib.h> float wznmacierz(float* macierz, int rozmiar)/*"macierz" means a matrix and "rozmiar" is a size of matrix */ { if (rozmiar == 1) return *macierz; float *podmacierz = malloc((rozmiar-1)*(rozmiar-1)*sizeof(float)); float wyznacznik = 0; float *podmacierz_start = podmacierz; // 保存子矩阵起始地址 for(int element_S = 0; element_S < rozmiar; element_S++) { podmacierz = podmacierz_start; // 重置指针到起始位置 for (int w = 1 ; w < rozmiar; w++ ) { for(int kolumna = 0; kolumna < rozmiar; kolumna++) { if(kolumna == element_S) continue; *podmacierz = macierz[(rozmiar*w)+(kolumna)]; podmacierz++; } } wyznacznik += macierz[element_S]*( element_S % 2 ? -1: 1)* wznmacierz(podmacierz_start, rozmiar-1); } free(podmacierz_start); // 释放子矩阵内存 return wyznacznik; } int main() { float a[2][2]={{1,3},{9,8}}; printf("%f", wznmacierz(a,2)); return 0; }
测试这个代码,输入的2x2矩阵行列式为1*8 - 3*9 = -19,程序会正确输出-19.000000。
内容的提问来源于stack exchange,提问作者krzys_13
相关产品推荐
相关产品推荐

