Sie sind auf Seite 1von 9

Estructura de Datos

Recursividad
Prof.: Mauricio Solar

Prof.: Lorna Figueroa

Primer Semestre,
2010

Universidad Tcnica Federico Santa Mara - Departamento de Informtica

Indice

Introduccin
Definicin
Condiciones para la Recursividad
Tipos de Recursividad
Aplicaciones

Universidad Tcnica Federico Santa Mara - Departamento de Informtica

Ejemplo Matrushka
La Matrushka es una artesana tradicional rusa.
Es una mueca de madera que contiene otra mueca ms pequea
dentro de s. Esta mueca, tambin contiene otra mueca dentro.
Y as, una dentro de otra.

Universidad Tcnica Federico Santa Mara - Departamento de Informtica

Introduccin
En las siglas del proyecto GNU de la Free Software
Foundation, las siglas GNU significan GNU is Not Unix.
En ella, para definir una cosa se hace referencia a ella misma,
la definicin no resulta entonces muy til.
Pero esto mismo, utilizado como tcnica de programacin,
resulta ser muy til e interesante.
Esto se conoce como recurrencia.

Universidad Tcnica Federico Santa Mara - Departamento de Informtica

Definicin
Consiste en definir valor de una funcin en trminos de
instancias ms simples, menores o anteriores de la misma
funcin, llegando hasta una instancia tan simple que el valor se
determina en forma inmediata.
Tiene que ver con el principio de induccin: si se establece
una proposicin que es vlida para el primer elemento de un
conjunto numerable y si, suponiendo que esta proposicin es
vlida para el n-simo elemento del conjunto, se puede deducir
que es vlida tambin para el sucesor de l, entonces se puede
afirmar que es vlida para cualquier elemento del conjunto.

Universidad Tcnica Federico Santa Mara - Departamento de Informtica

Introduccin
Ejemplo 1: Factorial de un nmero
F(n) = n(n - 1 ) !
Ejemplo 2: Nmero de Fibonacci
F(n) = F(n-1) + F(n-2)
F(0) = 0
F(1) = 1

Universidad Tcnica Federico Santa Mara - Departamento de Informtica

Introduccin
Ejemplo 3: Las Torres de Hanoi

Universidad Tcnica Federico Santa Mara - Departamento de Informtica

Introduccin
Las definiciones recursivas se traducen fcilmente a instrucciones
del lenguaje :
int factorial (int n) {
if (n == 0)
return 1 ;
else
return (n * factorial (n-1)) ;
}

Universidad Tcnica Federico Santa Mara - Departamento de Informtica

Cmo funciona?
Cada llamada recursiva siempre debe tender a un caso base que
puede resolverse sin recursin.
El caso base puede no realizar accin alguna, pero lo
importante es que se llegue a un punto en el que no se
produzcan ms auto-llamadas.
Para alcanzar el caso base, es necesario que los parmetros de
cada llamada recursiva, deben corresponder a un caso ms
pequeo del problema inicial.
Tras el caso base, se producir un retorno en el que el resultado
de cada llamada se ir incorporando al de la llamada anterior
hasta obtener un resultado definitivo que ser devuelto a la
sentencia que realiz la primera llamada al algoritmo.

Universidad Tcnica Federico Santa Mara - Departamento de Informtica

Cmo funciona?
Cuando un algoritmo se llama a si mismo es como si se
ejecutase un nuevo proceso mientras el anterior permanece
dormido.

Esto se consigue guardando en una pila la direccin de


retorno y elementos locales al algoritmo que realiza la
llamada:

direccin de retorno, constantes, variables, tipos,


funciones y procedimientos.

Universidad Tcnica Federico Santa Mara - Departamento de Informtica

Cmo funciona?
Es fcil suponer que sin caso base las infinitas llamadas
recursivas provocaran un desbordamiento de pila (Stack
Overflow).
El cdigo que permite la recursin es aadido automticamente
cuando el compilador detecta una llamada recursiva.

Universidad Tcnica Federico Santa Mara - Departamento de Informtica

Cuatro reglas bsicas del diseo recursivo


1. Existe caso base?, es decir, existe una salida no recursiva al
procedimiento?
2. Existe progreso?, es decir, cada llamada recursiva se refiere
a un caso ms pequeo?
3. Suponiendo correcto lo anterior, funciona todo bien?
4. El trabajo no debe duplicarse resolviendo el mismo tipo de
problema en llamadas separadas.

Universidad Tcnica Federico Santa Mara - Departamento de Informtica

Cundo usar recursividad?


Cuando la solucin recursiva no es ms exigente que la iterativa
Cuando la solucin iterativa es de elevada complejidad

Universidad Tcnica Federico Santa Mara - Departamento de Informtica

Cundo usar recursividad?


Ejemplo de uso inadecuado de la recursin porque la versin
iterativa es ms rpida y econmica :
Factorial (n) {
resultado=1;
for c=1 to n do
resultado = resultado*c;
La versin recursiva es preferible a la iterativa, en este caso,
por motivos de legibilidad.

Universidad Tcnica Federico Santa Mara - Departamento de Informtica

Diagrama de las instancias


Consiste en indicar en una caja, que es una instancia de llamada
de la funcin:
las entradas (argumentos) y
salidas (valores de retorno) junto con las llamadas
interiores:
argumento

llamada
funcin

retorno

valor

Universidad Tcnica Federico Santa Mara - Departamento de Informtica

Condiciones para la funcin recursiva


Para el caso de llamar a factorial(5) se tiene :

5
120

n!

24

n!

Universidad Tcnica Federico Santa Mara - Departamento de Informtica

Condiciones para la funcin recursiva


En este caso se obtiene un esquema lineal de llamadas a
funciones, que termina en una llamada a la instancia ms simple
(0 !)
Esto no es siempre as:
Ejemplo 2: Fibonacci
int fibo (int n) {
if (n < 2 )
return n;
else
return fibo (n-1) + fibo (n-2);
}

Ejemplo: valor de la
serie para i = 4

4
F4
2

F2

F3

F0

0
F1

F1

F2
0

F0
0

F1

Universidad Tcnica Federico Santa Mara - Departamento de Informtica

Condiciones para la funcin recursiva


En este caso el nmero de llamadas es mayor y crece mucho
ms rpido.
Determinacin del nmero de llamadas recursivas:
Sea T(n) es el # llamadas necesarias para calcular F(n).
Se tiene:
T (0) = 1
T (1) = 1
T (n) = 1 + T (n-1) + T ( n-2)
Luego:
T(n) = 2 Fn+1-1,
n 0

Universidad Tcnica Federico Santa Mara - Departamento de Informtica

Condiciones para la funcin recursiva


El nmero de llamadas es mayor que el valor que se est
determinando.
No es siempre conveniente aplicar la recursividad en forma
directa.
Puede haber ineficiencias, que en este caso corresponde a
calcular muchas veces repetidas el valor de la funcin para
ciertos argumentos.

Universidad Tcnica Federico Santa Mara - Departamento de Informtica

Recursividad Directa

Recursividad Indirecta

Recursividad Indirecta

Universidad Tcnica Federico Santa Mara - Departamento de Informtica

Ejemplos
Convierte decimal a binario:
while n >0
resto = (n % 2)
write(resto);
n= n / 2

Pero (46)10 = (101110)2 y esta solucin iterativa lo imprime al


revs: 011101

Universidad Tcnica Federico Santa Mara - Departamento de Informtica

Ejemplos
La solucin recursiva imprimir el resultado correcto:
Convierte (n) {
if (n !=0 )
Convierte(n / 2)
write (n % 2)
}

Primero divide hasta el ltimo y al retornar va imprimiendo los


restos desde ese ltimo.

Universidad Tcnica Federico Santa Mara - Departamento de Informtica

Bibliografa Webgrafa
Estructuras de Datos y Anlisis de Algoritmos. Una
Introduccin usando Java. Jos Galaviz Casas. Departamento de
Matemticas, Facultad de Ciencias. UNAM.
http://ocw.udem.edu.mx/cursos-de-profesional/estructura-dedatos/contenido/modulo2_la_recursividad/recursividad/

Das könnte Ihnen auch gefallen