Dúvida em método recursivo [Resolvido]

10 respostas
L

Olá pessoal,

Estou com dificuldades em compreender como funciona os métodos recursivos. Mesmo estudando os materiais didáticos, estou empacado.

Vejam o código abaixo,

class programa4{ public static void main(String[] args){ System.out.println(fatNaoRecursivo(5)); System.out.println(fatRecursivo(5)); } static int fatNaoRecursivo(int n){ if(n<2) return 1; int f=1; for(int i=2; i<=n; i++) f*=i; return f; } static int fatRecursivo(int n){ if(n<2) return 1; return fatRecursivo(n-1)*n; } }

É fácil enteder que o valor retornado no primeiro método é 120. Agora no segundo que é recursivo chego ao resultado 20, pois não consigo ver nada além de

return fatRecursivo(n-1)*n == return fatRecursivo(5-1)*5 == return fatRecursivo(4)*5 == 20

Qual a maneira correta de entender esse método recursivo? Como ele alcança o resultado de 120?

Até mais!

10 Respostas

Guilherme_Gomes

É recursivo, voce tem que imaginar o metodo rodando varias vezes

return fatRecursivo(n-1)n == return fatRecursivo(5-1)5 == return fatRecursivo(4)5 == return 5(4(3(2*1)))

juliofsn

Luciano, repare que a função fatRecursivo chama ela mesma dentro do seu corpo, essa é a maior característica de um método recursivo.

O if dentro estabelece um critério de parada, senão a função ficará chamando ela mesma infinitamente e iria causar um erro no programa.

L

Guilherme Gomes e juliofsn,

Muito obrigado pelo retorno. Mas ainda estou com dúvidas. Seria algo assim o processo recursivo? É correto representá-lo como abaixo?
static int fatRecursivo(int 5){  
    if(5<2) return 1;  
    return fatRecursivo(5-1)*5; //return fatRecursivo(4)*5 
}

 static int fatRecursivo(int 4){  
    if(4<2) return 1;  
    return fatRecursivo(4-1)*4; //return fatRecursivo(3)*4 
}

 static int fatRecursivo(int 3){  
     if(3<2) return 1;  
     return fatRecursivo(3-1)*3; //return fatRecursivo(2)*3 
}   

 static int fatRecursivo(int 2){  
     if(2<2) return 1;  
     return fatRecursivo(2-1)*1; //return fatRecursivo(1)*2
}         

 static int fatRecursivo(int 1){  
     if(1<2) return 1;                //if(1<2) == true
     return fatRecursivo(n-1)*n; 
}
i) Quando a avaliação do último if for falsa, ele pará a recursividade e retorna um resultado acumulado == 1*2*3*4*5?

ii) Por que ele não retorna o valor "1" do return que segue imeiatamente o if(n<2)?

vanzella

cara a melhor forma de vc entender é debugando linha a linha:

class programa4{  
     public static void main(String[] args){  
       System.out.println(fatNaoRecursivo(5));  
       System.out.println(fatRecursivo(5));  
     }  
     static int fatNaoRecursivo(int n){  
       if(n<2) return 1;  
       int f=1;  
       for(int i=2; i<=n; i++) f*=i;  
       return f;  
     }  
     static int fatRecursivo(int n){  
       if(n<2) return 1;  
       int valor = fatRecursivo(n-1)*n; 
       return valor;
     }  
   }
juliofsn

Luciano Mattar:

i) Quando a avaliação do último if for falsa, ele pará a recursividade e retorna um resultado acumulado == 12345?

ii) Por que ele não retorna o valor “1” do return que segue imeiatamente o if(n<2)?

i) quase isso que acontece, na verdade ele faz o caminho de volta retornando o valor para cada chamada da função, lembre-se que até o if ser false nenhuma delas chegou ao fim ainda, todas estão esperando o retorno da chamada que fez, você pode ver isso se debugar esse código como o colega acima disse.

ii) ele retorna sim, só que não influi no cálculo: 11234*5 é a mesma coisa de 12345 :wink:

L

Juliofsn,

Só mais uma coisa. Sobre o return 1, não entendi por que ele retorna justamente multiplicando a série de multilpicações geradas?

juliofsn

ops, falha minha, só vai ter um “1” mesmo

fatRecursivo(2) -> não entra no if e chama fatRecursivo(1)*2
fatRecursivo(1) -> entra no if e retorna 1

mya

Passo a passo:

(vou me referir a fatRecursivo como fR para facilitar)

a main chama fR(5)
o retorno é 5fR(4)
que retorna fR(4)=4
fR(3)
e assim por diante, a fR chama a si mesma até chegar em um retorno especificado.
fR(3)=3fR(2)
fR(2)=2
fR(1)
fR(1) retorna 1.
Assim, a pilha gerada com as multiplicações vai sendo desmontada.
fR(2)=21=2
fR(3)=3
2=6
fR(4)=46=24
fR(5)=5
24=120

Note que cada função chamada retorna o valor para a anterior, fR(2) retorna 2 para a fR(3).

L

Obrigado pessoal!

Todos foram de grande ajuda =)

Não sei como fechar o tópico.

Moderador, por favor.

E

Mode o título de seu post original, acrescentando [resolvido]

Não se trancam os posts, a menos que eles tenham causado problemas.

Criado 23 de outubro de 2009
Ultima resposta 26 de out. de 2009
Respostas 10
Participantes 6