como mais um metido a competir em "maratonas de programação", recursão é uma ferramenta fundamental… entao, achei um otimo material sobre o assunto… http://introcs.cs.princeton.edu/java/23recursion/ mas, em um dos excercicios, tentando compreender como aconteceu a recursão, eu travei…
public static void ex233(int n) {
if (n <= 0) return;
StdOut.println(n);
ex233(n-2);
ex233(n-3);
StdOut.println(n);
}
esse metodo, com a entrada (6) me da a seguinte saida:
6
4
2
2
1
1
4
3
1
1
3
6
tendando acompanha com a cabeça o que foi feito, ate a seguinte saida eu consegui entender…
6
4
2
2
daqui pra frente foi um misterio, alguem mais experiente em recursão poderiam me explicar como esses passos foram tomados ?
Para ficar mais claro, vou usar a seguinte nomenclatura nos comentário: n-x, onde “n” representa a quantidade de vezes que a recusividade ocorreu e “x” é uma instrunção dentro do corpo do método
Primeira execução:
public static void ex233(6) {
if (n <= 0) return;
StdOut.println(6);
ex233(4);//1-a
ex233(3);//1-b
StdOut.println(6);//1-c
}
Isso imprime: 6
//1-a
public static void ex233(4) {
if (n <= 0) return;
StdOut.println(4);
ex233(2);//2-a
ex233(1);//2-b
StdOut.println(4);//2-c
}
Isso imprime: 4
//2-a
public static void ex233(2) {
if (n <= 0) return;
StdOut.println(2);
ex233(0);//3-a
ex233(-1);//3-b
StdOut.println(2);3-c
}
Isso imprime: 2
Perceba no último caso, que as chamada 3-a e 3-b não retornam nada; logo, 3-c é chamado e novamente 2 é impresso na tela. Agora, 2-b é chamada. Assim:
//1-b
public static void ex233(1) {
if (n <= 0) return;
StdOut.println(1);
ex233(-1);//4-a
ex233(-2);//4-b
StdOut.println(1);//4-c
}
Isso imprime: 1
Novamente, as chamadas às funções 4-a e 4-b não retornam nada. 4-c é chamamada e 1 é novamente impresso na tela. Agora, 1-b é chamada:
//1-b
public static void ex233(3) {
if (n <= 0) return;
StdOut.println(3);
ex233(1);//5-a
ex233(0);//5-b
StdOut.println(3);//5-c
}
Isso imprime 3 na tela; agora 5-a é chamada:
//5-a
public static void ex233(1) {
if (n <= 0) return;
StdOut.println(1);
ex233(0);//6-a
ex233(-1);//6-b
StdOut.println(1);//6-c
}
Isso imprime: 1. 6-a e 6-b não retornam nada. 6-c é chamada e novamente 1 é impresso na tela. 5-b não retorna nada. 5-c é chamada e 3 é impresso na tela.
Retornando agora para a 1-c, agora 6 é impresso na tela.
No fim de tudo, isso imprime na tela a sequencia que você mostrou como resultado da recursão.
Minha explicação não tá muito boa mas acho que dá pra entender. Qualquer coisa grita ai.
Abs.
cara, obrigado mesmo, sua explicação foi bem clara, me perdi quando a as condição para o metodo ser chamado dinovo ficam falsas, mas agora eu entendi como funciona… obrigado;