Recursividade / determinante de matriz

5 respostas
mariotec13

eae galera, blz? estou tentando construir um metodo que retorne o derterminante de uma matriz de ordem nxn usando de recursividade utilizando o metodo de laplace, a minha dificuldade esta em ir acumulando o valor a cada interação, em linguagem c basta passar uma variavel como referencia e ir acumulando nesta, por ser novo em java, não consegui encontrar uma alternativa que se equivale a variaveis passadas por refencia em linguagem funcional, e uma linguagem como java deve haver uma saida bem mais pratica e eficiente, segue abaixo o que conseguir fazer ate agora:

public int DetMatriz(int mat[][], int ord) {

		if (ord == 1)
			return (mat[0][0]);
		if (ord == 2) return ( mat[0][0] * mat[1][1] - mat[1][0] * mat[0][1] );
		else {
			int[][] matAux = new int[ord - 1][ord - 1];
			int colAux = 0;
			
			for (int controle = 0; controle < ord; controle++) {

				for (int linha = 1; linha < ord; linha++) {
					for (int coluna = 0; coluna < ord; coluna++)
						if (controle != coluna)
							matAux[linha - 1][colAux++] = mat[linha][coluna];

					colAux = 0;
				}
				return ( (int) Math.pow((-1), controle) * mat[0][controle] * DetMatriz(
						matAux, ord - 1) );
				}
		}
	}

espero que alguem possa me ajudar, desde ja agradeço. Mario.

5 Respostas

ftabah

você pode criar uma variável que pertença à classe e não ao método.
basta declarar a variável fora do método e acessála dentro do método usando a sintaxe this.nomeVariável. ex:

public class Ftabah{
    private int variavel;
    public void divideEImprimeAteUm(){
        if(this.variavel/2 >= 1){
            System.out.println(this.variavel);
            this.variavel = this.variavel/2;
            divideEImprimeAteUm();
        }
        else
            System.out.println("fim");
    }
}
mariotec13
ftabah:
você pode criar uma variável que pertença à classe e não ao método. basta declarar a variável fora do método e acessála dentro do método usando a sintaxe this.nomeVariável. ex:
public class Ftabah{
    private int variavel;
    public void divideEImprimeAteUm(){
        if(this.variavel/2 >= 1){
            System.out.println(this.variavel);
            this.variavel = this.variavel/2;
            divideEImprimeAteUm();
        }
        else
            System.out.println("fim");
    }
}

entao ftabah dei uma modificada no codigo e ficou assim:

private int DET;

public int DetMatriz(int mat[][], int ord) {

		if (ord == 1)
			return (mat[0][0]);

		if (ord == 2) return (mat[0][0] * mat[1][1] - mat[1][0] * mat[0][1]);
	        else {
			int[][] matAux = new int[ord - 1][ord - 1];
			int colAux = 0;

			for (int controle = 0; controle < ord; controle++) {

				for (int linha = 1; linha < ord; linha++) {
					for (int coluna = 0; coluna < ord; coluna++)
						if (controle != coluna)
							matAux[linha - 1][colAux++] = mat[linha][coluna];

					colAux = 0;
				}
				
				if (mat[0][controle] != 0) this.DET += (int) Math.pow((-1), controle)
							* mat[0][controle] * DetMatriz(matAux, ord - 1);
			}
		}
		return (this.DET);
	}

para as matrizes :
1 0 0 0
1 1 1 1
2 3 4 9
2 4 10 28

e

1 0 0
1 1 1
2 3 5

o determinante da certo, mais por exemplo para a matriz:

1 0 0 0 0
1 1 1 1 1
2 3 5 9 17
2 4 10 28 82
2 5 17 65 257

da errado, :shock: ?

abrass

ftabah

é só pra matrizes quadradas esse método ou ele é válido para outros tipos de matrizes?
vc tá fazendo a regra de Sarrus né? eu não manjo mto essa regra pra analisar seu código… faz tempo que eu não vejo conceitos matemáticos, hehehe…

Agora eu lembro que tinha uma somatória na fórmula, você está fazendo somatória? (mals a preguiça de tentar entender seu código)

abs

mariotec13

ftabah:
é só pra matrizes quadradas esse método ou ele é válido para outros tipos de matrizes?
vc tá fazendo a regra de Sarrus né? eu não manjo mto essa regra pra analisar seu código… faz tempo que eu não vejo conceitos matemáticos, hehehe…

Agora eu lembro que tinha uma somatória na fórmula, você está fazendo somatória? (mals a preguiça de tentar entender seu código)

abs

:smiley: kkk então eu to usando laplace, mais vlw pela ajuda, antes nem dava resultado algum kk, ja é um começo…vlw

maquiavelbona

Só para ser chato: não existe determinante de matrizes não quadradas e o método de Sarrus só funciona para matrizes 3x3.

Até!

Criado 10 de maio de 2009
Ultima resposta 11 de mai. de 2009
Respostas 5
Participantes 3