You are on page 1of 39

Fundamentos de programacin

Tema 5. Recursividad

Gabriel Navarro
(email: gnavarro@ugr.es)

Objetivos del tema


Entender el concepto de recursividad.
Conocer los fundamentos del diseo de algoritmos recursivos.
Comprender la ejecucin de algoritmos recursivos.
Aprender a realizar trazas de algoritmos recursivos.
Comprender las ventajas e inconvenientes de la recursividad.

Fundamentos de Programacin. Tema 5: Recursividad


2

Recursividad: Introduccin
La recursividad es una herramienta muy potente tanto en
matemticas como en programacin. Permite definir
conceptos y algoritmos de una forma simple. Por ejemplo:
Factorial (n)=

1 ; si n=1
nFactorial (n1); si n>0

Una funcin es recursiva si, dentro de su cdigo fuente, se


llama a s misma. Toda funcin recursiva tiene 2
componentes:
Caso base: Contiene la condicin de parada de la
recursividad.
Caso general: Contiene el cdigo recursivo.
Fundamentos de Programacin. Tema 5: Recursividad
3

Recursividad: Introduccin (factorial.cpp)


Caso base: Sirve
para parar la
ejecucin recursiva
cuando se cumplen
las condiciones
deseadas.
Caso general: La
funcin se llama a s
misma dentro del
cdigo.

Fundamentos de Programacin. Tema 5: Recursividad


4

Recursividad: Introduccin
Ejemplo de clculo recursivo de 3!:

Devuelve 6

Factorial(3)= 3*Factorial(2)
Devuelve 2

Factorial(2)= 2*Factorial(1)
Devuelve 1

Factorial(1)= 1

Fundamentos de Programacin. Tema 5: Recursividad


5

Recursividad: Caso base


Son los casos del problema que se resuelve con un segmento
de cdigo sin recursividad.
Siempre debe existir al menos un caso base
El nmero y forma de los casos base son hasta cierto punto
arbitrarios. La solucin ser mejor cuanto ms simple y
eficiente resulte el conjunto de casos seleccionados.

Fundamentos de Programacin. Tema 5: Recursividad


6

Recursividad: Caso general


Si el problema es suficientemente complejo, la solucin se
expresa, de forma recursiva, como la unin de
1. La solucin de uno o ms subproblemas (de igual
naturaleza pero menor tamao).
2. Un conjunto de pasos adicionales. Estos pasos junto con
las soluciones a los subproblemas componen la solucin al
problema general que queremos resolver.
Los casos generales siempre deben avanzar hacia un caso base.
Es decir, la llamada recursiva se hace a un subproblema ms
pequeos y, en ltima instancia, los casos generales alcanzarn un
caso base.

Fundamentos de Programacin. Tema 5: Recursividad


7

Recursividad: Ejemplos
Ejemplo de clculo recursivo de varias funciones conocidas:
Suma(a , b)=

a ; si b=0
1+Suma( a , b1) ; si b>0

Multiplica(a , b)=

1 ; si b=0
a+Multiplica(a , b1) ; si b>0

{
{

Maximo(V , n)=

v [0]; si n=0
max(V [n] maximo(V , n1)); si n>0

ElevarA( x , n)=

1 ; si n=0
xElevarA(x , n1) si n>0

Fibonacci(n)=

1 ; si n=0,1
Fibonacci (n1)+Fibonacci (n2) ; si n>1

Fundamentos de Programacin. Tema 5: Recursividad


8

Recursividad: Qu hace este cdigo?

Fundamentos de Programacin. Tema 5: Recursividad


9

Recursividad: Qu hace este cdigo?

Fundamentos de Programacin. Tema 5: Recursividad


10

Recursividad: Qu hace este cdigo?

Fundamentos de Programacin. Tema 5: Recursividad


11

Recursividad: Qu hace este cdigo?

Fundamentos de Programacin. Tema 5: Recursividad


12

Recursividad: Qu hace este cdigo?

Fundamentos de Programacin. Tema 5: Recursividad


13

Recursividad: Qu hace este cdigo?


Cul es la funcin
recursiva que
ejecuta este cdigo?

Fundamentos de Programacin. Tema 5: Recursividad


14

Recursividad: Ejecucin de funciones recursivas


En general, en la pila se almacena el entorno asociado a las
distintas funciones que se van activando.
En particular, en un mdulo recursivo, cada llamada recursiva
genera una nueva zona de memoria en la pila independiente del
resto de llamadas.

Fundamentos de Programacin. Tema 5: Recursividad


15

Recursividad: Ejecucin de funciones recursivas


EJEMPLO: El factorial para n=3
1. Cada llamada return (n*factorial(n-1)); genera una nueva zona de
memoria en la pila, siendo n-1 el correspondiente parmetro actual para esta
zona de memoria y queda pendiente la evaluacin de la expresin y la
ejecucin del return.
2. El proceso anterior se repite hasta que la condicin del caso base se hace
Cierta. Empieza la vuelta atrs de la recursin, se evalan las expresiones y se
ejecutan los return que estaban pendientes.

Fundamentos de Programacin. Tema 5: Recursividad


16

Recursividad: Ejecucin de funciones recursivas

Fundamentos de Programacin. Tema 5: Recursividad


17

Recursividad: Ejecucin de funciones recursivas

Fundamentos de Programacin. Tema 5: Recursividad


18

Recursividad: Ejecucin de funciones recursivas

Fundamentos de Programacin. Tema 5: Recursividad


19

Recursividad: Ejecucin de funciones recursivas

Fundamentos de Programacin. Tema 5: Recursividad


20

Recursividad: Traza de algoritmos recursivos


Se representan en
cascada
cada una
Se representan
ende
las
llamadas
al mdulo
cascada
cada
una
recursivo,
de las llamadas
as
sus
al como
mdulo
recursivo,
respectivas
zonas de
as como sus
memoria
y los valores
respectivas
que
devuelven.
zonas
de memoria
y los valores que
devuelven.

Fundamentos de Programacin. Tema 5: Recursividad


21

Recursividad: Ejercicio
Averiguar qu hace este algoritmo

cuando se invoca: Recursivo(V,0,3), siendo V = [3,7,0,1]


Fundamentos de Programacin. Tema 5: Recursividad
22

Recursividad: Ejercicio

Fundamentos de Programacin. Tema 5: Recursividad


23

Recursividad: Ejercicio

Fundamentos de Programacin. Tema 5: Recursividad


24

Recursividad: Otros ejemplos avanzados


Bsqueda lineal recursiva (busquedalineal.cpp):

Fundamentos de Programacin. Tema 5: Recursividad


25

Recursividad: Otros ejemplos avanzados

Bsqueda con xito:


3

BLR(v,4,5);

3
3

Fundamentos de Programacin. Tema 5: Recursividad


26

Recursividad: Otros ejemplos avanzados

Bsqueda con fracaso:


BLR(v,4,8);
-1
-1
-1
-1
-1

Fundamentos de Programacin. Tema 5: Recursividad


27

Recursividad: Otros ejemplos avanzados


Bsqueda binaria recursiva (busquedabinaria.cpp):

Fundamentos de Programacin. Tema 5: Recursividad


28

Recursividad: Otros ejemplos avanzados

Bsqueda con xito:


BBR(v,0,5,6);

Fundamentos de Programacin. Tema 5: Recursividad


29

Recursividad: Otros ejemplos avanzados

Bsqueda con fracaso:


BBR(v,0,5,2);

Fundamentos de Programacin. Tema 5: Recursividad


30

Recursividad: Otros ejemplos avanzados


Ordenacin rpida (quicksort.cpp):
Se basa en la particin del vector en dos partes:
1. Tomar un elemento arbitrario del vector: pivote.
Normalmente el primero. Sea p su valor.
2.Recorrer el vector de izquierda a derecha hasta encontrar
un elemento situado en una posicin i tal que v[i] > p.
3. Recorrer el vector de derecha a izquierda hasta encontrar
otro elemento situado en una posicin j tal que v[j] < p.
4.Intercambiar los elementos de las casillas i y j
(ahora, v[i] < p < v[j]).
5.Repetir hasta que los dos procesos de recorrido se
encuentren (i > j).
6.Colocar el pivote en el sitio que le corresponde.
7.El vector est particionado en dos zonas delimitadas por el
pivote.
Fundamentos de Programacin. Tema 5: Recursividad
31

Recursividad: Otros ejemplos avanzados

Fundamentos de Programacin. Tema 5: Recursividad


32

Recursividad: Otros ejemplos avanzados

Fundamentos de Programacin. Tema 5: Recursividad


33

Recursividad: Equivalencia
(factorialnorecursivo.cpp)
Toda funcin recursiva se puede implementar con una funcin
no recursiva (iterativa) equivalente. Ejemplo:

Fundamentos de Programacin. Tema 5: Recursividad


34

Recursividad: ventajas y desventajas


Ventajas:
Fcil diseo e implementacin.
Alta claridad del cdigo.
Tamao del cdigo reducido.
Desventajas:
Altamente ineficientes:
Posible sobrecarga de la pila
Mltiples copias de los parmetros de la funcin
Repeticin de clculos
La depuracin de cdigo recursivo es compleja.
Fundamentos de Programacin. Tema 5: Recursividad
35

Recursividad: ventajas y desventajas


Ejemplo de ineficiencia (sucesin de Fibonacci)
(fibonacci_time.cpp fibonacci_iter_time.cpp)
int fibonacci (int n){
if ((n == 0) || (n == 1)) return (1);
else return (fibonacci(n-1) + fibonacci(n-2));
}
int fibonacci2 (int n){
int i=1, j=0;
for (int k=0;k<n;k++)
j=i+j ; i=j-i ;
return j;
}
Fundamentos de Programacin. Tema 5: Recursividad
36

Recursividad: Otros ejemplos

Clculo coeficientes binomiales

Torres de Hanoi

Ordenacin por fusin

Fundamentos de Programacin. Tema 5: Recursividad


37

Bibliografa recomendada

Antonio Garrido, Fundamentos de Programacin en


C++, Delta Publicaciones, 2006. Pginas 1-41.
Deitel & Deitel. C++: Cmo Programar. Sexta
edicin, Prentice Hall-Pearson, 2008
Walter Savitch. Resolucin de problemas con C++,
Pearson, 2006.

Fundamentos de Programacin. Tema 5: Recursividad


38

Dnde estudiar este tema

Antonio Garrido, Fundamentos de Programacin en


C++, Delta Publicaciones, 2006.
Pginas 291-316.

Fundamentos de Programacin. Tema 5: Recursividad


39