如何解决以递归方式获取矩阵的输入会导致索引超出边界异常
我应该编写一个 java 程序,其中包含为矩阵提供值并递归打印矩阵的值。 我试过这段代码,但每次我给出输入时,它都会给出超出边界的索引异常。如果我传递的数字变量比数字少一个,则输入少一个
import java.util.Scanner;
public class DSPro {
static Scanner scan = new Scanner(System.in);
public static void main(String[] args) {
static double matrix1[][];
static double matrix2[][];
static double result[][];
System.out.println("What would be the number of n?");
int number = Integer.parseInt(scan.nextLine());
matrix1 = new double [number][number];
matrix2 = new double [number][number];
result = new double [number][number];
initialize(matrix1,number,number);
}
public static void initialize(double [][] matrix,int i,int j)
{
if(i == -1&&j==-1)
return ;
matrix[i][j] = Double.parseDouble(scan.nextLine());
if(j == -1)
initialize(matrix,i-1,matrix[0].length);
else
initialize(matrix,i,j-1);
}
}
我还尝试将 1 添加到 number 并传递函数 number-1 而不是 n,异常更改为:
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 3
at data_structure.DSPro.initialize(DSPro.java:168)
at data_structure.DSPro.initialize(DSPro.java:171)
at data_structure.DSPro.initialize(DSPro.java:174)
at data_structure.DSPro.initialize(DSPro.java:174)
at data_structure.DSPro.main(DSPro.java:53)
您认为是我的递归代码有问题还是我将其传递给方法的方式有问题?
解决方法
它需要更少的输入,因为:
if(i == 0 && j==0)
return;
元素 [0,0] 也应该设置。 尝试将条件更改为:
if (i == -1 || j == -1)
return;
索引越界,因为您应该从 [length - 1] 索引开始:
initialize(matrix,number - 1,number - 1);
您还可以在输入每个元素之前添加消息,以便用户知道他正在输入哪个元素。并在最后打印矩阵以确保它是正确的。
最终代码如下:
import java.util.Arrays;
import java.util.Scanner;
public class DSPro {
static Scanner scan = new Scanner(System.in);
static double[][] matrix;
public static void main(String[] args) {
System.out.println("What would be the number of n?");
int number = Integer.parseInt(scan.nextLine());
matrix = new double[number][number];
initialize(matrix,number - 1);
for (double[] row : matrix) {
System.out.println(Arrays.toString(row));
}
}
public static void initialize(double[][] matrix,int i,int j) {
if (i == -1 || j == -1) return;
System.out.println("Enter element [" + i + "," + j + "]");
matrix[i][j] = Double.parseDouble(scan.nextLine());
if (j == 0) initialize(matrix,i - 1,matrix.length - 1);
else initialize(matrix,i,j - 1);
}
}