2015-12-19 1 views
1

J'ai fait un petit programme pour calculer le déterminant d'une matrice en utilisant une certaine récursivité. J'ai essayé une matrice 5x5 et j'ai eu une erreur de débordement de pile. Je comprends que la récursivité est probablement trop profonde mais je suis perdu sur la façon d'y remédier. Des solutions?Mon programme me donne un StackOverflowError

Voici mon code:

/** 
* @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

Est-ce que cela fonctionne pour les matrices plus petites? Vous savez bien sûr que toute solution récursive peut être réécrite comme une solution non récursive, en utilisant souvent une pile quelconque. Je vous suggère de regarder cela et de l'essayer. –

+0

Oui, cela fonctionne pour les plus petits. Je vais essayer de l'écrire avec une pile et voir comment ça se passe. –

+0

Je suggère de lire les valeurs de la matrice à partir d'un fichier (pipe à partir de là), il sera plus facile à tester. Ensuite, si vous l'exécutez depuis eclipse ou un autre IDE, essayez de l'invoquer depuis DEBUG. Ajoutez des points de rupture au code source pour rechercher des erreurs. Si vous aviez partagé le code complet et les valeurs d'entrée, et les valeurs attendues, il serait plus facile d'aider. –

Répondre

2

Cela provoque des problèmes (et lignes suivantes sont liées):

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

Vous créez en fait le sous-matrice exactement de la même taille que l'original, puis appliquez récursion.

Je suppose que vous voulez créer avec row et sous-matrice col complètement exclu, donc de la taille d'une plus petite dans chaque dimension et déplacer le contenu vers la gauche et de haut en row spécifiée et col.

+0

Merci, cela résout le problème. Je viens de faire les dimensions de la nouvelle matrice un de moins que les dimensions de la précédente. –