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
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
L
Luciano_Mattar
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)=4fR(3)
e assim por diante, a fR chama a si mesma até chegar em um retorno especificado.
fR(3)=3fR(2)
fR(2)=2fR(1)
fR(1) retorna 1.
Assim, a pilha gerada com as multiplicações vai sendo desmontada.
fR(2)=21=2
fR(3)=32=6
fR(4)=46=24
fR(5)=524=120
Note que cada função chamada retorna o valor para a anterior, fR(2) retorna 2 para a fR(3).
L
Luciano_Mattar
Obrigado pessoal!
Todos foram de grande ajuda =)
Não sei como fechar o tópico.
Moderador, por favor.
E
entanglement
Mode o título de seu post original, acrescentando [resolvido]
Não se trancam os posts, a menos que eles tenham causado problemas.