Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Estructura de Datos
Clase 11: Repaso de Recursividad
Carlos Contreras Bolton
Universidad Andr
es Bello
Facultad de Ingeniera
24 de Abril de 2014
1/19
Introducci
on Estructura general Recurrencia o iteraci
on? Recursi
on Infinita Recursividad directa e indirecta Ejercicios
Contenido
1 Introducci
on
2 Estructura general
3 Recurrencia o iteraci
on?
4 Recursi
on Infinita
5 Recursividad directa e indirecta
6 Ejercicios
2/19
Introducci
on Estructura general Recurrencia o iteraci
on? Recursi
on Infinita Recursividad directa e indirecta Ejercicios
Introduccion
3/19
Introducci
on Estructura general Recurrencia o iteraci
on? Recursi
on Infinita Recursividad directa e indirecta Ejercicios
Introduccion
Una funcion que se llama a s misma, directa o
indirectamente, es una funci
on recursiva.
La recursion es un potente concepto con el que se pueden
expresar ciertos procedimientos de calculo muy
elegantemente.
No obstante, al principio cuesta un poco entender las
funciones recursivas . . . y un poco mas disenar nuestras
propias funciones recursivas.
La recursion es un concepto difcil cuando se
esta aprendiendo a programar.
Empezaremos por presentar y estudiar una funcion
recursiva.
Carlos Contreras Bolton Estructura de Datos
4/19
Introducci
on Estructura general Recurrencia o iteraci
on? Recursi
on Infinita Recursividad directa e indirecta Ejercicios
5/19
Introducci
on Estructura general Recurrencia o iteraci
on? Recursi
on Infinita Recursividad directa e indirecta Ejercicios
6/19
Introducci
on Estructura general Recurrencia o iteraci
on? Recursi
on Infinita Recursividad directa e indirecta Ejercicios
Estructura general
Aplicaci
on de recursi
on: Se tratan los datos de tal
forma que se realice la llamada recursiva.
7/19
Introducci
on Estructura general Recurrencia o iteraci
on? Recursi
on Infinita Recursividad directa e indirecta Ejercicios
Factorial
Funci
on recursiva
1 int f a c t o r i a l ( int n)
2 {
3
i f ( n == 0 | | n == 1 )
4
return 1;
5
else
6
r e t u r n n f a c t o r i a l ( n1) ;
7 }
8/19
Introducci
on Estructura general Recurrencia o iteraci
on? Recursi
on Infinita Recursividad directa e indirecta Ejercicios
Recurrencia o iteracion?
9/19
Introducci
on Estructura general Recurrencia o iteraci
on? Recursi
on Infinita Recursividad directa e indirecta Ejercicios
Recurrencia o iteracion?
Para toda funcion recursiva podemos encontrar otra que
haga el mismo calculo de modo iterativo.
Pero no siempre es facil hacer esa conversion.
En ocasiones, la version recursiva es mas elegante y
legible que la iterativa (o, cuando menos, se parece mas
la definicion matematica).
Las versiones iterativas suelen ser mas eficientes que las
recursivas, pues cada llamada a una funcion supone pagar
una pequena penalizacion en tiempo de calculo y espacio
de memoria, ya que se consume memoria y algo de
tiempo en gestionar la pila de llamadas a funcion.
10/19
Introducci
on Estructura general Recurrencia o iteraci
on? Recursi
on Infinita Recursividad directa e indirecta Ejercicios
Recursion Infinita
Una eleccion inapropiada de los casos base puede
conducir a una recursion que no se detiene jamas. Es lo
que se conoce por recursion infinita y es analoga a los
bucles infinitos.
Por ejemplo, imagina que deseamos implementar el
calculo recursivo del factorial y disenamos esta funcion
erronea:
1 int f a c t o r i a l ( int n)
2 {
3
i f ( n == 1 )
4
return 1;
5
else
6
r e t u r n n f a c t o r i a l ( n1) ;
7 }
11/19
Introducci
on Estructura general Recurrencia o iteraci
on? Recursi
on Infinita Recursividad directa e indirecta Ejercicios
Recursion Infinita
Que ocurre si calculamos con ella el factorial de 0, que
es 1?
Se dispara una cadena infinita de llamadas recursivas,
pues el factorial de 0 llama a factorial de 1, que a su
vez llama factorial de 2, y as sucesivamente.
Jam
as llegaremos al caso base.
El computador no se quedara colgado indefinidamente: el
programa acabara por provocar una excepcion. Por que?
Porque la pila de llamadas ira creciendo hasta ocupar
toda la memoria disponible, y entonces Python y C
indicara que se produjo un desbordamiento de pila (en
ingles, stack overflow).
Carlos Contreras Bolton Estructura de Datos
12/19
Introducci
on Estructura general Recurrencia o iteraci
on? Recursi
on Infinita Recursividad directa e indirecta Ejercicios
13/19
Introducci
on Estructura general Recurrencia o iteraci
on? Recursi
on Infinita Recursividad directa e indirecta Ejercicios
Recursividad indirecta
N
umero par o impar
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
i n t par ( i n t a )
{
i f ( a==0)
return 1;
else
r e t u r n i m p a r ( a1) ;
}
i n t impar ( i n t a )
{
i f ( a==0)
return 0;
else
r e t u r n p a r ( a1) ;
}
14/19
Introducci
on Estructura general Recurrencia o iteraci
on? Recursi
on Infinita Recursividad directa e indirecta Ejercicios
Sucesion de Fibonacci
La sucesion de Fibonacci es la siguiente sucesion infinita de
numeros naturales.
0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377
Los numeros de Fibonacci quedan definidos por la ecuacion:
fn = fn1 + fn2
Podemos re-expresar esta definicion
0
fn = 1
fn1 + fn2
Carlos Contreras Bolton Estructura de Datos
matematicamente as:
si n = 0
si n = 1
si n > 1
15/19
Introducci
on Estructura general Recurrencia o iteraci
on? Recursi
on Infinita Recursividad directa e indirecta Ejercicios
Sucesion de Fibonacci
Funci
on recursiva
16/19
Introducci
on Estructura general Recurrencia o iteraci
on? Recursi
on Infinita Recursividad directa e indirecta Ejercicios
Sucesion de Fibonacci
Llamadas de la funci
on recursiva
17/19
Introducci
on Estructura general Recurrencia o iteraci
on? Recursi
on Infinita Recursividad directa e indirecta Ejercicios
Recursividad en Listas
1 v o i d r e c o r r e r L i s t a ( Nodo i )
2 {
3
i f ( i != NULL)
4
{
5
p r i n t f ( % d , i>d a t o s>d a t o 1 ) ;
6
r e c o r r e r L i s t a ( i>s i g u i e n t e ) ;
7
}
8
else
9
p r i n t f ( \n ) ;
10 }
1 b o o l b u s c a r L i s t a ( Nodo i , i n t x )
2 {
3
i f ( i != NULL)
4
{
5
i f ( x == i>d a t o s>d a t o 1 )
6
return true ;
7
b u s c a r L i s t a ( i>s i g u i e n t e , x ) ;
8
}
9
return false ;
10 }
1 i n t main ( i n t a r g c , c h a r a r g v [ ] )
2 {
3
L i s t a L = c r e a L i s t a ( ) ;
4
i n s e r t a r (L , 1) ;
5
i n s e r t a r (L , 2) ;
6
i n s e r t a r (L , 3) ;
7
r e c o r r e r (L) ;
8
r e c o r r e r L i s t a ( L>i n i c i o ) ;
9
i f ( b u s c a r L i s t a ( L>i n i c i o , 3 ) )
10
p r i n t f ( Se e n c u e n t r a \n ) ;
11
else
12
p r i n t f ( No s e e n c u e n t r a \n ) ;
13
d e s t r u i r L i s t a (L) ;
14
return 0;
15 }
18/19
Introducci
on Estructura general Recurrencia o iteraci
on? Recursi
on Infinita Recursividad directa e indirecta Ejercicios
Ejercicios
1
2
19/19