A função recursiva é uma função que chama por si só
Ele permite que os programadores escrevam programas eficientes usando uma quantidade mínima de código .
A desvantagem é que eles podem causar loops infinitos e outros resultados inesperados se não forem escritos corretamente .
Explicarei as funções Recursiva Simples e Recursiva de Cauda
Para escrever uma função recursiva simples
- O primeiro ponto a considerar é quando você deve decidir sair do loop, que é o loop if
- O segundo é qual processo fazer se formos nossa própria função
Do exemplo dado:
public static int fact(int n){
if(n <=1)
return 1;
else
return n * fact(n-1);
}
Do exemplo acima
if(n <=1)
return 1;
É o fator decisivo quando sair do loop
else
return n * fact(n-1);
O processamento real deve ser feito
Deixe-me interromper a tarefa, uma a uma, para facilitar o entendimento.
Vamos ver o que acontece internamente se eu correr fact(4)
- Substituindo n = 4
public static int fact(4){
if(4 <=1)
return 1;
else
return 4 * fact(4-1);
}
If
loop falhar, então ele vai para else
loop, então ele retorna4 * fact(3)
Na memória da pilha, temos 4 * fact(3)
Substituindo n = 3
public static int fact(3){
if(3 <=1)
return 1;
else
return 3 * fact(3-1);
}
If
loop falhar, então ele vai para else
loop
então retorna 3 * fact(2)
Lembre-se de que chamamos `` `` 4 * fact (3) ``
A saída para fact(3) = 3 * fact(2)
Até agora, a pilha tem 4 * fact(3) = 4 * 3 * fact(2)
Na memória da pilha, temos 4 * 3 * fact(2)
Substituindo n = 2
public static int fact(2){
if(2 <=1)
return 1;
else
return 2 * fact(2-1);
}
If
loop falhar, então ele vai para else
loop
então retorna 2 * fact(1)
Lembre-se de que ligamos 4 * 3 * fact(2)
A saída para fact(2) = 2 * fact(1)
Até agora, a pilha tem 4 * 3 * fact(2) = 4 * 3 * 2 * fact(1)
Na memória da pilha, temos 4 * 3 * 2 * fact(1)
Substituindo n = 1
public static int fact(1){
if(1 <=1)
return 1;
else
return 1 * fact(1-1);
}
If
loop é verdadeiro
então retorna 1
Lembre-se de que ligamos 4 * 3 * 2 * fact(1)
A saída para fact(1) = 1
Até agora, a pilha tem 4 * 3 * 2 * fact(1) = 4 * 3 * 2 * 1
Finalmente, o resultado de fato (4) = 4 * 3 * 2 * 1 = 24
A recursão da cauda seria
public static int fact(x, running_total=1) {
if (x==1) {
return running_total;
} else {
return fact(x-1, running_total*x);
}
}
- Substituindo n = 4
public static int fact(4, running_total=1) {
if (x==1) {
return running_total;
} else {
return fact(4-1, running_total*4);
}
}
If
loop falhar, então ele vai para else
loop, então ele retornafact(3, 4)
Na memória da pilha, temos fact(3, 4)
Substituindo n = 3
public static int fact(3, running_total=4) {
if (x==1) {
return running_total;
} else {
return fact(3-1, 4*3);
}
}
If
loop falhar, então ele vai para else
loop
então retorna fact(2, 12)
Na memória da pilha, temos fact(2, 12)
Substituindo n = 2
public static int fact(2, running_total=12) {
if (x==1) {
return running_total;
} else {
return fact(2-1, 12*2);
}
}
If
loop falhar, então ele vai para else
loop
então retorna fact(1, 24)
Na memória da pilha, temos fact(1, 24)
Substituindo n = 1
public static int fact(1, running_total=24) {
if (x==1) {
return running_total;
} else {
return fact(1-1, 24*1);
}
}
If
loop é verdadeiro
então retorna running_total
A saída para running_total = 24
Finalmente, o resultado de fato (4,1) = 24