递归计算矩阵行列式的Java程序出现数组越界异常求助
递归计算矩阵行列式的Java程序越界错误修复
错误原因分析
1. 循环边界错误
原代码中for (int i = 0; i <= len; i++)和for (int j = 0; j <= len; j++)的边界设置错误,矩阵索引范围是0到len-1,使用<= len会导致访问超出矩阵长度的索引,直接触发ArrayIndexOutOfBoundsException。
2. 余子式矩阵构建逻辑完全错误
Python版本中,余子式矩阵s是去掉原矩阵第一行,再去掉每行的第i列,但Java代码直接用原矩阵的i、j索引给s[i][j]赋值,完全不符合余子式的生成规则,而且s的尺寸是len-1,当i或j大于等于len-1时必然越界。
3. 递归调用时机错误
原Java代码在j的内层循环中就调用递归,正确逻辑应该是针对第一行的每个元素,先构建好对应的余子式矩阵,再计算累加项。
修正后的Java代码
import java.util.*; public class linear_equation { public static float determinant(float[][] a) { int len = a.length; // 基准条件:1阶矩阵直接返回唯一元素 if (len == 1) { return a[0][0]; } float ans = 0; // 遍历第一行的每个元素,计算对应余子式的行列式 for (int i = 0; i < len; i++) { // 创建余子式矩阵:尺寸为(len-1)x(len-1) float[][] s = new float[len - 1][len - 1]; // 填充余子式:跳过原矩阵的第一行和第i列 for (int row = 1; row < len; row++) { int colIndex = 0; for (int col = 0; col < len; col++) { if (col != i) { s[row - 1][colIndex++] = a[row][col]; } } } // 累加:元素值 * 余子式行列式 * 符号因子 ans += a[0][i] * determinant(s) * (float) Math.pow(-1, i); } return ans; } public static void main(String[] args) { Scanner sc = new Scanner(System.in); System.out.println("请输入矩阵的阶数"); int len = sc.nextInt(); float[][] a = new float[len][len]; System.out.println("请输入矩阵元素:"); for (int i = 0; i < len; i++) { for (int j = 0; j < len; j++) { a[i][j] = sc.nextFloat(); } } System.out.print("行列式的值为:" + determinant(a)); sc.close(); } }
关键修正点说明
- 调整循环边界为
< len,避免索引越界; - 按照余子式定义构建子矩阵:跳过原矩阵第一行和当前元素所在列;
- 将递归调用移到外层循环(对应第一行每个元素),构建完正确子矩阵后再计算累加项;
- 增加
sc.close()关闭输入流,避免资源泄漏。
内容的提问来源于stack exchange,提问作者Arnav joharwal
相关产品推荐
相关产品推荐

