Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Clase terica 3
Contenido
Recursividad
Uso dentro de estructuras de datos
Recursividad / Recursin
Definicin: Un algoritmo es recursivo si se encuentra
definido en trminos de s mismo.
Salida de recursin
Como se observ en el ejemplo anterior, en una funcin
recursiva debe existir por lo menos un caso donde la
respuesta se obtiene sin necesidad de hacer ms llamadas
recursivas, a este caso se le denomina salida de la
recursin (en el ejemplo anterior 1! = 1) y es necesario
para que la funcin no se quede en un ciclo infinito.
La recursin es muy til en ciertos problemas que por
naturaleza son recursivos. La desventaja sin embargo es
la gran cantidad de memoria que se ocupa debido al
llamado continuo de funciones que se van acumulando.
Cada llamado recursivo implica una copia en memoria de
la funcin, junto con sus argumentos y variables internas.
Ejemplo
import java.util.*;
Devuelve 4*6=24
factorial(4), N=4
Devuelve 3*2=6
Llama a
factorial(3), N=3
Devuelve 2*1 = 2
Llama a
factorial(2), N=2
Devuelve 1
Llama a
factorial(1), N=1
Llamados mltiples
Hacer el rastreo a una funcin recursiva cuando solo se
hace un llamado por vez es relativamente simple (como en
el ejemplo anterior). Sin embargo, cuando hay ms de un
llamado es ms fcil de entender, no como una pila, si no
como un rbol de recursiones.
Miremos otro ejemplo clsico de una funcin que puede
definirse de manera recursiva: la serie de Fibonacci
Fibonacci(n) = Fibonacci(n-1) + Fibonacci(n-2)
Sabiendo que Fibonacci(1) = 0, Fibonacci(2) = 1
*Recordemos: 0 1 1 2 3 5 8 13 21 34
Ejemplo
import java.util.*;
Ejemplo
//...
System.out.println(fib(x));
Devuelve 2+1=3
Suponiendo x=5
fib(5), N=5
Devuelve 1+0=1
Devuelve 1+1=2
Llama a
fib(4), N=4
fib(3), N=3
Devuelve 0
Devuelve 1
Devuelve 1+0=1
fib(3), N=3
Devuelve 1
Llama a
fib(2), N=2
Llama a
fib(2), N=2
Devuelve 0
fib(1), N=1
Devuelve 1
Llama a
fib(2), N=2
fib(1), N=1
Llamados mltiples
Habiendo entendido como se hacen llamados mltiples dentro
de un proceso recursivo, hagamos una prueba de escritorio al
siguiente cdigo:
import java.util.*;
public class Main {