Está en la página 1de 19

Introducci

on Estructura general Recurrencia o iteraci


on? Recursi
on Infinita Recursividad directa e indirecta Ejercicios

Estructura de Datos
Clase 11: Repaso de Recursividad
Carlos Contreras Bolton
Universidad Andr
es Bello
Facultad de Ingeniera

24 de Abril de 2014

Carlos Contreras Bolton Estructura de Datos

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

Carlos Contreras Bolton Estructura de Datos

2/19

Introducci
on Estructura general Recurrencia o iteraci
on? Recursi
on Infinita Recursividad directa e indirecta Ejercicios

Introduccion

Carlos Contreras Bolton Estructura de Datos

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

Calculo recursivo del factorial

Sea la siguiente definicion matematica, valida para valores


positivos de n:
(
1
si n = 0 y n = 1
n! =
n (n 1)! si n > 1

Carlos Contreras Bolton Estructura de Datos

5/19

Introducci
on Estructura general Recurrencia o iteraci
on? Recursi
on Infinita Recursividad directa e indirecta Ejercicios

Calculo recursivo del factorial

Carlos Contreras Bolton Estructura de Datos

6/19

Introducci
on Estructura general Recurrencia o iteraci
on? Recursi
on Infinita Recursividad directa e indirecta Ejercicios

Estructura general

En general un algoritmo recursivo se compone de dos partes:


1 Caso base: Es la condici
on de termino de la recursion.
2

Aplicaci
on de recursi
on: Se tratan los datos de tal
forma que se realice la llamada recursiva.

Carlos Contreras Bolton Estructura de Datos

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 }

Carlos Contreras Bolton Estructura de Datos

8/19

Introducci
on Estructura general Recurrencia o iteraci
on? Recursi
on Infinita Recursividad directa e indirecta Ejercicios

Recurrencia o iteracion?

Hemos propuesto una solucion recursiva para el calculo


del factorial, pero en clases anteriores hemos hecho ese
mismo calculo con un metodo iterativo.
1 int f a c t o r i a l ( int n)
2 {
3
int f = 1, i ;
4
f o r ( i = 1 ; i <= n ; i ++)
5
f = i ;
6
return f ;
7 }

Carlos Contreras Bolton Estructura de Datos

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.

Carlos Contreras Bolton Estructura de Datos

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 }

Carlos Contreras Bolton Estructura de Datos

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

Recursividad directa e indirecta

Recursividad directa: Es la que vimos.


Recursividad indirecta: es cuando, en su definicion,
llama a otro que, a su vez, contiene al menos una llamada
directa o indirecta al primero.

Carlos Contreras Bolton Estructura de Datos

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) ;
}

Carlos Contreras Bolton Estructura de Datos

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

1 int fibonacci ( int n)


2 {
3
i f ( n == 0 | | n == 1 )
4
return n ;
5
else
6
r e t u r n f i b o n a c c i ( n1) + f i b o n a c c i ( n2) ;
7 }

Carlos Contreras Bolton Estructura de Datos

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

Carlos Contreras Bolton Estructura de Datos

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 }

Carlos Contreras Bolton Estructura de Datos

18/19

Introducci
on Estructura general Recurrencia o iteraci
on? Recursi
on Infinita Recursividad directa e indirecta Ejercicios

Ejercicios

1
2

Disene un programa que imprima los n primeros numeros.


Disene un programa que calcule la potencia de un numero
(x n ).
Disene un programa que invierta un numero.

Carlos Contreras Bolton Estructura de Datos

19/19

También podría gustarte