método Recursivo

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

CLASSE MODELO:

[code]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;
}

}[/code]
CLASSE MAIN:

[code]public class main {

public static void main(String[] args) {

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

}

}[/code]
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???

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 ...

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…

agora funcionou :slight_smile:

mas porque precisa do return??

vlw!

[quote=eriniom]Gostaria de saber se alguem pode me explicar o que acontece com esse código:

CLASSE MODELO:

[code]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;
}

}[/code]
CLASSE MAIN:

[code]public class main {

public static void main(String[] args) {

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

}

}[/code]
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???
[/quote]

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.

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:

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…

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++++…

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])

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

Putz,
nem lembro dessa thread.
hahahahah

mrbbm,
não entendi sua pergunta.

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í?

[quote=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])[/quote]

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

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

[quote=mrbbm]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í?[/quote]

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.