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));
}
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. –
Oui, cela fonctionne pour les plus petits. Je vais essayer de l'écrire avec une pile et voir comment ça se passe. –
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. –