2. RECURSIVIDAD
• Un método o función es recursiva cuando se llama a sí misma.
• Se puede llamar a sí mismo, bien directamente o bien
indirectamente a través de otro método.
f1
f1 f2 fn…
Definición
4. Imaginemos que el método func() es recursivo. Cuando este método se ejecuta, en
algún punto, se llamará a sí mismo. Tal como muestra el diagrama, no hay ningún bucle
involucrado, ya que se realiza una copia del método. A continuación, las sentencias de
la copia comienzan a ejecutarse, aunque esta vez con distintos argumentos. Si se
desencadena otra llamada recursiva, se realizará otra copia. Y así sucesivamente hasta
que, en una copia del método func(), los argumentos permitan alcanzar el caso base y
permitan que la copia haga un "return", es decir, que transfiera el control de nuevo a su
padre. En ese momento, el padre toma el control, ejecuta el resto de su sentencia y,
cuando llegue el momento, pasa el control a su padre. Este proceso se repite hasta que
el control vuelve al método de llamada inicial, que ha estado esperando este momento
todo el tiempo y ahora puede terminar.
5. Actividades que realiza una Función recursiva
Los programas recursivos tienden a ser lentos porque generan muchas llamadas a
funciones y éstas pueden tener mucha sobrecarga. La sobrecarga es trabajo que la
computadora tiene que realizar. Para cada llamada a una función, la computadora
debe:
1) Guardar las variables locales del módulo que llama
2) Encontrar el método
3) Hacer copias de los argumentos que llaman por valor
4) Pasar los argumentos
5) Ejecutar el método
6) Encontrar al módulo que llama
7) Restituir las variables locales del módulo que llama.
7. Recursión vs. iteración
• La iteración se puede utilizar en lugar de la recursión
• Un algoritmo iterativo utiliza una construcción de bucle
• Un algoritmo recursivo utiliza una estructura de ramificación
• Soluciones recursivas son a menudo menos eficiente, en
términos de tiempo y espacio, que las soluciones iterativas.
• La recursividad puede simplificar la solución de un problema, a
menudo resulta en menos líneas de código que una solución
iterativa.
Un algoritmo recursivo utiliza una estructura de ramificación
8. Recursión vs. iteración
• Cada llamada recursiva produce una nueva creación y copia de las
variables de la función, esto consume más memoria e incrementa el
tiempo de ejecución. Por el contrario, la iteración se produce dentro
de un método, de modo que las operaciones suplementarias en la
llamada al método y en la asignación de memoria adicional son
omitidas.
9. Consideraciones al hacer una función recursiva
• Determine el caso base
• Condición de salida
• Determine el caso general
• Función/método recursivo
Un algoritmo recursivo debe tener dos partes: una parte de terminación en la que se deja de
hacer llamadas, es el caso base, y una llamada recursiva con sus propios parámetros.
10. Escribir un método recursivo que calcule el factorial de
un número n y un programa que pida un
número entero y escriba su factorial..
• La función factorial (símbolo: !) se define como el producto de
todos los números enteros positivos desde 1 hasta n.
Ejemplo
11. • Por ejemplo si se quiere calcular el factorial de 5, se tendría:
5! = 5*4*3*2*1
FCC - BUAP Primavera 2015BBM11
12. FCC - BUAP Primavera 2015BBM12
Ejemplo con recursividad
5!
5* 4!
4* 3!
3* 2!
2* 1!
1
5!
5* 4!
4* 3!
3* 2!
2* 1!
1
Se devuelve 1
Se devuelve 2!=2*1=2
Se devuelve 3!=3*2=6
Se devuelve 4!=4*6=24
Se devuelve 5!=5*24=120
Valor devuelto 120
14. public static void main(String[] ar)throws IOException
{
int n;
BufferedReader entrada = new BufferedReader(new InputStreamReader(System.in));
do
{
System.out.print("Introduzca número n: ");
n = Integer.parseInt(entrada.readLine());
}while (n < 0);
System.out.println("n t" + n + "!= " + factorial(n));
}
static double factorial (int n)
{
if (n <= 1)
return 1;
else
{
double resultado = n * factorial(n - 1);
return resultado;
} }
15. Inicialmente, en la ubicación “A” hay una pila de discos. EL disco más pequeño está
en la parte superior, y el diámetro de los discos aumenta a medida que se
desciende hacia la base de la “torre”. Las ubicaciones, “B” y “C” están vacías
inicialmente.
Fuente Auxiliar Destino
Reglas:
- Mover un disco a la vez.
- Nunca colocar un disco encima de un disco más pequeño.
Ejemplo Torres de Hanoi
16.
17. Análisis paso a paso – Torres de Hanoi
2 A,C,B
3 A,B,C
1 A,B,C
A->C
A->B
C->B
A->C
N
N
2 B,A,C
1 B,C,A
B->A
B->C
1 A,B,C
A->C
N
19. Tipos de recursión
• Recursividad simple: Aquella en cuya definición sólo aparece una llamada
recursiva. Se puede transformar con facilidad en algoritmos iterativos.
• Factorial
• Recursividad múltiple: Se da cuando hay más de una llamada a sí misma dentro
del cuerpo de la función, resultando más difícil de hacer de forma iterativa.
• Fibonacci
FCC - BUAP Primavera 2015BBM19
20. • Recursividad anidada: En algunos de los argumentos de la llamada recursiva hay
una nueva llamada a sí misma.
• Recursividad cruzada o indirecta: Son algoritmos donde una función provoca una
llamada a sí misma de forma indirecta, a través de otras funciones. Es decir es
aquella en la que una función es llamada a otra función y esta a su vez llama a la
función que la llamó.
FCC - BUAP Primavera 2015BBM20
Tipos de recursión
21. Conclusiones
• Se ha de evitar utilizar recursividad en situaciones de rendimiento
crítico o exigencia de altas prestaciones en tiempo y en memoria, ya
que las llamadas recursivas emplean tiempo y consumen memoria
adicional. No es conveniente el uso de una llamada recursiva para
sustituir un simple bucle.
• La solución recursiva siempre requerirá más tiempo y espacio debido
a las llamadas adicionales a los métodos.
Fuente [Joyanes A. Luis, “Estructura De Datos en Java” ]