La función recursiva es una función que llama por sí misma
Permite a los programadores escribir programas eficientes utilizando una cantidad mínima de código .
La desventaja es que pueden causar bucles infinitos y otros resultados inesperados si no se escriben correctamente .
Explicaré la función recursiva simple y la función recursiva de cola
Para escribir una función recursiva simple
- El primer punto a considerar es cuándo debe decidir salir del bucle, que es el bucle if
- El segundo es qué proceso hacer si somos nuestra propia función.
Del ejemplo dado:
public static int fact(int n){
if(n <=1)
return 1;
else
return n * fact(n-1);
}
Del ejemplo anterior
if(n <=1)
return 1;
Es el factor decisivo cuando salir del ciclo
else
return n * fact(n-1);
¿Se debe realizar el procesamiento real?
Permítanme romper la tarea uno por uno para una fácil comprensión.
Veamos qué sucede internamente si corro fact(4)
- Sustituyendo n = 4
public static int fact(4){
if(4 <=1)
return 1;
else
return 4 * fact(4-1);
}
If
el bucle falla, por lo que pasa al else
bucle y regresa4 * fact(3)
En la memoria de pila, tenemos 4 * fact(3)
Sustituyendo n = 3
public static int fact(3){
if(3 <=1)
return 1;
else
return 3 * fact(3-1);
}
If
el bucle falla, por lo que pasa al else
bucle
entonces regresa 3 * fact(2)
Recuerde que llamamos `` `4 * fact (3)` `
La salida para fact(3) = 3 * fact(2)
Hasta ahora la pila tiene 4 * fact(3) = 4 * 3 * fact(2)
En la memoria de pila, tenemos 4 * 3 * fact(2)
Sustituyendo n = 2
public static int fact(2){
if(2 <=1)
return 1;
else
return 2 * fact(2-1);
}
If
el bucle falla, por lo que pasa al else
bucle
entonces regresa 2 * fact(1)
Recuerda que llamamos 4 * 3 * fact(2)
La salida para fact(2) = 2 * fact(1)
Hasta ahora la pila tiene 4 * 3 * fact(2) = 4 * 3 * 2 * fact(1)
En la memoria de pila, tenemos 4 * 3 * 2 * fact(1)
Sustituyendo n = 1
public static int fact(1){
if(1 <=1)
return 1;
else
return 1 * fact(1-1);
}
If
el bucle es verdadero
entonces regresa 1
Recuerda que llamamos 4 * 3 * 2 * fact(1)
La salida para fact(1) = 1
Hasta ahora la pila tiene 4 * 3 * 2 * fact(1) = 4 * 3 * 2 * 1
Finalmente, el resultado del hecho (4) = 4 * 3 * 2 * 1 = 24
La recursión de la cola sería
public static int fact(x, running_total=1) {
if (x==1) {
return running_total;
} else {
return fact(x-1, running_total*x);
}
}
- Sustituyendo 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
el bucle falla, por lo que pasa al else
bucle y regresafact(3, 4)
En la memoria de pila, tenemos fact(3, 4)
Sustituyendo n = 3
public static int fact(3, running_total=4) {
if (x==1) {
return running_total;
} else {
return fact(3-1, 4*3);
}
}
If
el bucle falla, por lo que pasa al else
bucle
entonces regresa fact(2, 12)
En la memoria de pila, tenemos fact(2, 12)
Sustituyendo n = 2
public static int fact(2, running_total=12) {
if (x==1) {
return running_total;
} else {
return fact(2-1, 12*2);
}
}
If
el bucle falla, por lo que pasa al else
bucle
entonces regresa fact(1, 24)
En la memoria de pila, tenemos fact(1, 24)
Sustituyendo n = 1
public static int fact(1, running_total=24) {
if (x==1) {
return running_total;
} else {
return fact(1-1, 24*1);
}
}
If
el bucle es verdadero
entonces regresa running_total
La salida para running_total = 24
Finalmente, el resultado del hecho (4,1) = 24