2015-12-19 4 views
1

Я сделал небольшую программу для вычисления детерминанта матрицы с использованием некоторой рекурсии. Я попробовал матрицу 5x5 и получил ошибку переполнения стека. Я понимаю, что рекурсия, вероятно, слишком глубока, но я теряюсь на том, как ее исправить. Любые решения?Моя программа дает мне StackOverflowError

Вот мой код:

/** 
* @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)); 
} 
+0

Работает ли он для меньших матриц? Вы знаете, конечно, что любое рекурсивное решение может быть переписано как нерекурсивное решение, часто используя какой-то стек. Я предлагаю вам посмотреть на это и попробовать. –

+0

Да, это работает для небольших. Я попробую написать его со стеком и посмотреть, как это происходит. –

+0

Я предлагаю прочитать значения матрицы из файла (труба это оттуда), будет легче протестировать. Затем, если вы запустите его из затмения или другой среды IDE, попробуйте вызвать его из DEBUG. Добавьте точки останова в исходный код, чтобы искать ошибки. Если у вас есть общий код и входные значения и ожидаемые значения, было бы легче помочь. –

ответ

2

Это вызывает проблемы (и последующие строки связаны):

int[][] newMatrix = new int[matrix.length][matrix[0].length]; 

Вы на самом деле создать подматрицы точно такого же размера, как и оригинал, а затем применить рекурсии.

Я предполагаю, что вы хотите создать подматрицы с row и col полностью исключены, поэтому размер одного меньше в каждом измерении и переместить содержимое слева и сверху указанного row и col.

+0

Спасибо, это решает проблему. Я просто сделал размеры новой матрицы меньше, чем размеры предыдущего. –

Смежные вопросы