método Recursivo

13 respostas
E

Gostaria de saber se alguem pode me explicar o que acontece com esse código:

CLASSE MODELO:
public class rec {

	private int a;
	private int b;

	public void rec(int a, int b) {
		this.recAux(a, b);
	}

	public int recAux(int a, int b) {
		if (a == 0) {
			return b;
		} else {
			a--;
			b++;
			b++;
			this.recAux(a, b);
		}
		return b;
	}
}
CLASSE MAIN:
public class main {

	public static void main(String[] args) {

		rec r = new rec();
		int i =r.recAux(5, 0);
		System.out.println(i);

	}

}
O código deve pegar o valor de a e duplicá-lo em b. é um exercício sobre Máquinas de dois registradores...

Se eu fizer o método recAux como void e dentro do if mandar dar um Println no B, funciona beleza...

Do jeito que está aí, depois que ele entra no bloco do if e executa o return b, ele pula para a chamada do método recAux e continua executando até o a assumir zero novamente, aí ele pára...

alguém pode me explicar por que isso acontece???

13 Respostas

eduveks

Tenta assim:

public class rec {
    public int recAux(int a, int b) {
        if (a == 0) {
            return b;
        } else {
            a--;
            b++;
            b++;
            return this.recAux(a, b);
        }
    }
}

Atenção aos nomes das Classes, a primeira letra deve ser sempre maiuscula…

O correto seria:

public class Rec ...

E:

public class Main ...
alanbrasil1984

cara ta exatamente acontecendo oque vc mandouuuu ele fazer…

atenbção para a nomeclatura java isso pode te dar sérios problemas no futuro.

1. public class rec { 2. public int recAux(int a, int b) { 3. if (a == 0) { 4. return b; 5. } else { 6. a--; 7. b++; 8. b++; 9. return this.recAux(a, b); 10. } 11. } 12. }

a == 5
b == 0

a-- == 4
b++ ++ == 2

a-- == 3
b++ ++ == 4

a-- == 2
b++ ++ == 6

a-- == 1
b++ ++ == 8

a-- == 0
b++ ++ == 8

ai ele retorna B que é 8.

vc manda no primeiro if quando a == 0 ele sai do metodo e retorna b que é 8.

pois foi isso que eu vi no code…

espero ter ajudado…

E

agora funcionou :slight_smile:

mas porque precisa do return??

vlw!

dm_thiago
eriniom:
Gostaria de saber se alguem pode me explicar o que acontece com esse código: CLASSE MODELO:
public class rec {

	private int a;
	private int b;

	public void rec(int a, int b) {
		this.recAux(a, b);
	}

	public int recAux(int a, int b) {
		if (a == 0) {
			return b;
		} else {
			a--;
			b++;
			b++;
			this.recAux(a, b);
		}
		return b;
	}
}
CLASSE MAIN:
public class main {

	public static void main(String[] args) {

		rec r = new rec();
		int i =r.recAux(5, 0);
		System.out.println(i);

	}

}
O código deve pegar o valor de a e duplicá-lo em b. é um exercício sobre Máquinas de dois registradores...

Se eu fizer o método recAux como void e dentro do if mandar dar um Println no B, funciona beleza...

Do jeito que está aí, depois que ele entra no bloco do if e executa o return b, ele pula para a chamada do método recAux e continua executando até o a assumir zero novamente, aí ele pára...

alguém pode me explicar por que isso acontece???

Ele só executará o return b quando o 'a' for zero, porque enquanto não for e ele entrar nesse else, e vai chamar o próprio método de novo depois de decrementar o a em uma unidade e de aumentar o b em duas unidades.

Para um código mais "bonito", e mais fácil de entender, coloque assim:
public int recAux(int a, int b) {
     if (a != 0) {
			a--;
			b++;
			b++;
			this.recAux(a, b);
		} else {
			return b;
		}
 }

Entendeu? É o mesmo método, escrito de um jeito diferente. Ele só irá retorna o b quando o a for igual a zero.

E

vlw thiago!

mas eu só queria saber pq quando faz a chamada do método this.recAux(a,b) ele continua executando e quando da o return this.recAux(a,b) ele pára…

:slight_smile:

eduveks

então o return… interrompe a execução do método…

por exemplo:

public void test(boolean sair) { if (sair) { return; } System.out.println("nao saiu..."); }

Se o sair for true, ele nunca vai chegar ao “nao saiu”, pois entra no if e cai fora…

E

mas veja o que acontecia…

public int recAux(int a, int b) {  
if (a == 0) {  
    return b;
} 
else {  
   a--;  
   b++;  
   b++;  
   this.recAux(a, b);
}

ele entrava no if e executava o return b, era pra sair do método não?
Mas ao invés de pular fora ele ia direto pro this.recAux(a,b).
sem executar o a–, b++++…

julianofischer

o return é sempre a última “instrução” de um método…
se há o return, o codigo abaixo dele nao sera executo (obviamente excetuando-se os desvios [if-else])

M

É boa prática utilizar um return para sair de um método?
Ou é melhor encher de IFs e ELSEs?
:roll:

julianofischer

Putz,
nem lembro dessa thread.
hahahahah

mrbbm,
não entendi sua pergunta.

M
public void meuMetodo(){

código A ()



if (condição){

código B ()

return “”;

}



continuação do código A ()

}

Isso que está em negrito é boa prática?
Ou seja, utilizar “return” para forçar a saída de um método é boa prática?
Ou é melhor:

public void meuMetodo(){

if (condição){

código B ()

return “”;

}

else{

código A ()

}

}

???
E aí?

nel

julianofischer:
o return é sempre a última “instrução” de um método…
se há o return, o codigo abaixo dele nao sera executo (obviamente excetuando-se os desvios [if-else])

Tem certeza?
E se eu usar o bloco try - finally, o que ocorre? :slight_smile:

Cuidado com as afirmações amigo.
Abraços.

nel
<blockquote><div class="quote-author">mrbbm:</div>public void meuMetodo(){

código A (…)



if (condição){

código B (…)

return “”;

}



continuação do código A (…)

}

Isso que está em negrito é boa prática?
Ou seja, utilizar “return” para forçar a saída de um método é boa prática?
Ou é melhor:

public void meuMetodo(){

if (condição){

código B ()

return “”;

}

else{

código A ()

}

}

???
E aí?

Sempre que postar código, por favor, use as tags code, veja como fica:

public void meuMetodo(){
   if (condição){
       [u]código B[/u] (...)
       return "";
   }
   else{
       código A (...)
   }
}

Não vejo problema em utilizar return, dentro de uma condição. Particularmente, há situações em que eu faço isso, mas, sempre quando faço apenas um if.
Exemplo.

if(condição)
   return algo;

Há situações em que não temos como fugir dos famosos if-else, mas há várias manerias de se fazer isso.
Podes usar Enum, Switch-case, entre outros, que na realidade são um if-else, mas você usa para ficar melhor visualmente (não vou entrar em detalhes de perfomance).

Por exemplo, queres saber se um inteiro é um determinado valor, mas elev aria de 0-10, para que 9 if´s e um else? Simplesmente faça um switch, entende?
Eu acredito que há melhor forma de se fazer, como atribuir valor a uma variavél, ao invés de se utilizar tantos return no método, mas é um ponto de vista, portanto, acredito que varia de programador para programador.

Abraços.

Criado 1 de abril de 2008
Ultima resposta 20 de jun. de 2011
Respostas 13
Participantes 7