Моя программа дает мне StackruError
Я сделал небольшую программу для вычисления определителя матрицы с использованием некоторой рекурсии. Я попробовал матрицу 5x5 и получил ошибку переполнения стека. Я понимаю, что рекурсия, вероятно, слишком глубокая, но я теряюсь в том, как ее исправить. Какие-либо решения?
Вот мой код:
/**
* @requires matrix is at least 2x2 and has all real entries
* @param matrix[][] a matrix
* @param row is the row to be omitted
* @param col is the column to be omitted
* @requires @code col and @code row are
* @returns the @code matrix without column
*/
private static int[][] subMatrix(int[][] matrix, int row, int col){
int[][] newMatrix = new int[matrix.length][matrix[0].length];
int newRow = 0;
for ( int i = 0; i < matrix.length; i++){
int newCol = 0;
if ( i != row ){
for( int j = 0; j < matrix[i].length; j++){
if ( j != 0){
newMatrix[i][j] = matrix[newRow][newCol];
newCol++;
}
}
newRow++;
}
}
return newMatrix;
}
/**
* @requires matrix is at least 2x2 and has all real entries
* @param matrix[][] a matrix
* @returns the determinant of @code matrix
*/
private static int det(int[][] matrix){
int det = 0;
int rows = matrix.length;
int cols = matrix[0].length;
//handling base case
if(rows == 2 & cols == 2){
det = matrix[0][0]*matrix[1][1] - matrix[0][1]*matrix[1][0];
} else {
//expanding a row
if(rows > cols)
{
for(int i = 0; i < rows; i++){
det += matrix[0][i]*det(subMatrix(matrix, i, 0));
}
}
//expanding a column
else {
for(int i = 0; i < rows; i++){
det += matrix[i][0]*det(subMatrix(matrix, 0, i));
}
}
}
return det;
}
/**
* @param args the command line arguments
*/
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
System.out.print("Enter the number of rows: ");
int rows = in.nextInt();
System.out.print("Enter the number of columns: ");
int cols = in.nextInt();
//reading in matrix
int[][] matrix = new int[rows][cols];
for(int i = 0; i < rows; i++){
System.out.print("Enter the entries of row " + i + ": ");
for (int j = 0; j < cols; j++){
matrix[i][j] = in.nextInt();
}
}
System.out.println("The determinant of the matrix is: " + det(matrix));
}
1 ответ
Решение
Это вызывает проблемы (и следующие строки связаны):
int[][] newMatrix = new int[matrix.length][matrix[0].length];
Вы фактически создаете подматрицу точно такого же размера, как и оригинал, а затем применяете рекурсию.
Я предполагаю, что вы хотите создать подматрицу с row
а также col
полностью исключен, поэтому имеет размер на единицу меньше в каждом измерении и перемещает содержимое влево и вверх до указанного row
а также col
,