Está en la página 1de 33

Unidad 3 Eficiencia de Algoritmos

Tema VIII: Recursividad.


Naturaleza. Recursividad directa e indirecta.
Comparacin con la iteracin. Recursividad
infinita. Resolucin de problemas complejos con
recursividad.

Mgter. Oscar Adolfo Vallejos


FaCENA - UNNE

Objetivos
Definir concepto de recursividad
Plantear su uso para formular soluciones a problemas que por sus
caractersticas requieren disear algoritmos que deben llamarse a si
mismos.
Presentar una estrategia de implementacin de problemas recursivos
Anlisis comparativo entre soluciones iterativas clsicas y las soluciones
recursivas

Recursividad
Premisas
Las definiciones recursivas suelen responder a funciones que
se definen en base a un caso menor de s mismas. Pero la
recursividad en programacin tiene otras implicaciones.
Substancial diferencia entre una funcin matemtica y un
funcin programada.
La recursividad en programacin, aunque est permitida en
prcticamente todos los lenguajes modernos, no es una
herramienta demasiado til en un entorno productivo.
Cundo debo utilizar entonces recursividad?

Definicin
La recursividad es una herramienta que permite
expresar la resolucin de un problema
evolutivos, donde es posible que un modulo de
software se invoque a s mismo en la solucin
del problema (Garland, 1986) (Helman, 1991)
(Aho, 1988).

Recursividad
Esta tcnica puede entenderse como un caso particular de la
programacin con subprogramas en la que se planteaba la resolucin de
un problema en trminos de otros subproblemas ms sencillos.
El concepto de recursin aparece en varias situaciones de la vida
cotidiana.
Otro tipo de recursin es la referente a los tipos de datos que se definen
en funcin de si mismos.
La recursin como herramienta de programacin permite definir un objeto
en trminos de si mismo. (listas circulares).
Funciones recursivas en matemtica

Aspectos a tener en cuenta en una solucin recursiva


Si la gua contiene una sola pgina
Entonces Buscar secuencialmente la persona dentro de la pgina
Sino
Abrir la gua a la mitad
Determinar en que mitad est la persona
Si la persona est en la primera mitad
Entonces Buscar en la primera mitad de la gua
Si no
Buscar en la segunda mitad de la gua
Fin

Tres observaciones sobre estos considerandos:

Una vez dividida la gua, y determinada la parte que contiene a la persona, el mtodo de
bsqueda a aplicar sobre esa mitad es el mismo que el empleado para la gua completa.
La mitad de la gua donde no esta el dato se descarta, lo cual significa una reduccin del
espacio del problema (eficiencia algortmica).
Hay un caso especial que se resuelve de una manera diferente que el resto, y sucede cuando
la gua queda reducida a una sola pgina (luego de varias subdivisiones).

Al escribir como procedimiento podemos hacer las siguientes


observaciones:
Una de las acciones del procedimiento es llamarse a si mismo.
Cada llamada al procedimiento Buscar realizada desde dentro
del procedimiento Buscar pasa como parmetro la mitad de la
gua, gua actual.
Hay una instancia de Buscar que se resuelve de manera
distinta a los dems Este es el caso en que la gua contiene una
solo pgina y se lo denomina caso base.

Recursividad
Resumen de conceptos ya establecidos

Un programa o subprograma que se llama a si mismo se dice que es recursivo.

El concepto de recursividad est ligado, en los lenguajes de programacin, al concepto de


procedimiento o funcin.

La recursividad es una de las formas de control ms importantes en la programacin.

Los procedimientos recursivos son la forma ms natural de representacin de muchos algoritmos.

Un razonamiento recursivo tiene dos partes: la base y la regla recursiva de construccin. La base no
es recursiva y es el punto tanto de partida como de terminacin de la definicin.

Premisas
1. El procedimiento se llama a si mismo
2. El problema se resuelve, resolviendo el mismo problema pero de tamao menor
3. La manera en la cual el tamao del problema disminuye asegura que el
caso
alcanzar.

base

se

Recursividad. Caso de estudio


** Factorial de un nmero **
Preguntas
1.- Como se puede definir el problema en trminos de un problema ms
simple de la misma naturaleza?
2.- Como ser disminuido el tamao del problema e cada llamado
recursivo?
3.- Que instancia del problema servir como caso base?

Matemticamente, el factorial de un nmero (n) se define de la siguiente manera:


Factorial (n) = n * (n 1) * (n 2) * (n 3) * . * 4 * 3 * 2 * 1.
Factorial (0) = 1.
El cdigo desde una solucin iterativa
Function Factorial (n: integer) : real;
Var
i: integer;
fact: real;
begin
fact:= 1;
For i := n downto 1 do
fact := fact * i ;
End;

Cmo funciona la recursividad del factorial?

Recursividad. Caso de estudio.


La posibilidad de que la funcin Fac se llame a si misma existe, porque en Pascal el
identificador Fac es valido dentro del bloque de la propia funcin (acurdense de los
temas de los mbitos de los bloques en las funciones y los procedimientos).
Al ejecutarlo sobre el argumento 4, se produce la cadena de llamadas sucesivas a Fac
(4), Fac (3), Fac (2), Fac (1) y a Fac (0), as:

Ejecucin de un programa y la pila de activacin


Se define pila de activacin como una estructura de
datos que se comporta de la siguiente manera:
Tiene un tope (top) y un fondo (botttom)
Cada elemento es cdigo ms dato
Los elementos pueden sacarse solo por el tope. El
nico elemento posible de sacar es el que est en el
tope

Ejecucin de un programa y la pila de activacin

Ejecucin de un programa y la pila de activacin


Concluimos sobre la ejecucin de un programa recursivo diciendo que bsicamente
consiste e una cadena de generacin de llamadas (suspendindose los restantes
clculos) y reanudacin de los mismos al termino de la ejecucin de las llamadas

En este proceso se destacan los siguientes detalles:

El subprograma comienza a ejecutarse normalmente y, al llegar a la llamada, se reserva el espacio para una nueva copia de
sus objetos locales y parmetros. Estos datos particulares de cada ejemplar generado se agrupan en la llamada pila de
activacin del subprograma.
El nuevo ejemplar del subprograma pasa a ejecutarse sobre su pila de activacin, que se apila sobre las llamadas recursivas
anteriores formando la llama pila recursiva.
Este proceso termina cuando un ejemplar no genera mas llamadas recursivas por consistir sus argumentos en casos bsicos.
Entonces se libera el espacio reservado para la pila de activacin de ese ejemplar, reanudndose las instrucciones del
subprograma anterior sobre la tabla penltima.
Este proceso de retorno finaliza con la llamada inicial.

Recursin Directa e Indirecta


Directa: El subprograma se llama directamente
a si mismo.

Recursin Directa e Indirecta


Indirecta: Un programa llama a otro subprograma y este a su vez al primero El
subprograma A llama al B y este a su vez llama al primero A, es decir que
luego de tantas llamadas el control regresa al subprograma A. Otro caso de
recursin indirecta es el caso b) de la figura, que muestra como un
subprograma llama a otro y este a un tercero y una vez ejecutado el
subprograma vuelve a donde fue llamado. En el ejemplo de la figura el
programa A llama al B y este al C; cuando finaliza la ejecucin C vuelve a
donde fue llamado B y este a su vez al subprograma A programa inicio.

Recursividad Mutua
La recursin mutua es aquella propiedad en la que un programa
contiene dos procedimientos P1 y P2 tales que cada uno de ellos
incluye una llamada al otro. En el caso de Pascal se requiere que
uno de los dos procedimientos tenga una declaracin forward. Una
aplicacin prctica que contiene recursin mutua es:

El cdigo

R.M

Codificacin de un Programa con Recursividad Mutua


Program Test; {contiene los procedimientos recursivos de Leer y Rechazar}
Var
Resp : char;
Procedure Rechazar (varResp : char) ; forward;
{visualiza un mensaje de respuesta no aceptable y lamada al procedimiento Leer}
Procedure Leer ( varResp : char); {fija el valor de Resp a S o N dependiendo de lo que el usuario escribe. Repite el proceso hasta que el
usuario teclea uno de los dos caracteres. Es recursivo mutuamente con Rechazar}
Begin
Writeln ('S para si o N para N');
Readln (resp);
If not (resp in [ 'S' , 'N' ]) then
Rechazar (resp);
End;
Procedure Rechazar (varResp : char ) ;
begin
writeln (resp, ' no es unas respuesta aceptable');
Leer (resp);
end;
Begin
Writeln ( 'Esto es una prueba');
Leer (resp);
Writeln ('El valor de Resp es ', Resp);
Writeln ('Fin de la prueba');
End.

Recursividad Infinita

Recursividad Infinita
Es muy importante que toda funcin recursiva
tenga un caso en el que no se llame a s misma, o
las llamadas seran infinitas y el programa no
tendra fin.
Por eso, siempre una funcin recursiva tiene una
condicin inicial en la que no debe llamarse a s
misma.

Correccin de subprogramas recursivos


Un subprograma recursivo no es ms que un caso particular de subprograma en
el que aparecen llamadas a s mismo. Esta peculiaridad hace que tengamos
que recurrir a alguna herramienta matemtica, de aplicacin no demasiado
complicada en la mayora de los casos.
El proceso de anlisis de la correccin de subprogramas recursivos puede ser
dividido, en dos partes:
una primera, en la que consideraremos los pasos de la verificacin comunes con los
subprogramas no recursivos;
y una segunda con los pasos en los que se aplican tcnicas especficas de verificacin de la
recursin.

Correccin de subprogramas recursivos


En resumen, para demostrar la correccin de un subprograma recursivo
hemos de comprobar:
La correccin del caso base.
La correccin de los casos recurrentes. Para ello, se supone la de las
llamadas subsidiarias, como ocurre en el paso inductivo con la hiptesis
de induccin.
Que las llamadas recursivas se hacen de manera que los parmetros se
acercan al caso base; por ejemplo, en el clculo del factorial, en las
sucesivas llamadas los parmetros son n; n - 1;., que desembocan en el
caso base 0, siempre que n > 0, lo cual se exige en la condicin previa de la
funcin.

Recursividad versus iteracin


Si un subprograma se llama a si mismo se repite su ejecucin
un cierto numero de veces.
Los procesos recursivos suelen ocupar ms memoria y tardar
ms que los iterativos.

Cules son las razones para elegir la recursin?

Recursividad versus iteracin


Tanto la iteracin como la recursin se basan en una estructura de
control:
la iteracin utiliza una estructura repetitiva
la recursin utiliza una estructura de seleccin.
La iteracin y la recursin implican ambas repeticin:
la iteracin utiliza explcitamente una estructura repetitiva
la recursin consume la repeticin mediante llamadas repetidas.
La iteracin y la recursin implican cada una un test de finalizacin
La iteracin termina despus de realizar n - veces
la recursin termina cuando se reconoce un caso base o la
condicin de salida se alcanza.

Ventajas y desventajas
Ventajas
Soluciones simples, claras
Soluciones elegantes.
Soluciones a problemas complejos.
Desventajas de la Recursin: INEFICIENCIA
Sobrecarga asociada con las llamadas a subalgoritmos
Una simple llamada puede generar un gran numero de llamadas recursivas.
(Fact(n) genera n llamadas recursivas)
La claridad compensa la sobrecarga?
El valor de la recursividad reside en el hecho de que se puede usar para resolver
problemas sin fcil solucin iterativa.
- La ineficiencia inherente de algunos algoritmos recursivos.
La recursividad se debe usar cuando sea realmente necesaria, es decir, cuando no exista
una solucin iterativa simple.

Conclusin
Se puede decir que la recursividad es una tcnica de programacin bastante
til y muy interesante de estudiar.
Recuerden que muchos problemas pueden resolverse con la misma facilidad
usando recursividad como iteracin.
En general para un mismo algoritmo, la recursividad permite una expresin
ms clara y sinttica lo que simplifica la comprensin y el mantenimiento del
mismo.
Las soluciones recursivas son normalmente menos eficientes, ya que
consumen ms tiempo (las invocaciones) y memoria (pila de activacin).
La recursividad es apropiada, tambin, cuando los datos involucrados en el
problema estn organizados en estructuras que pueden definirse
recursivamente, como listas, rboles, etc.
Las estrategias de resolucin de problemas denominada divide y vencers
o backtracking, son dos tcnicas muy utilizadas para la resolucin de
algoritmos complejos. Ambas utilizan recursividad.

BIBLIOGRAFIA. Especifica:

Fundamentos de programacin. Algoritmos, estructuras de datos y objetos; Luis Joyanes


Aguilar; 2003; Editorial: MCGRAW-HILL. ISBN: 8448136642. Captulo 16.

ALGORITMOS, DATOS Y PROGRAMAS con aplicaciones en Pascal, Delphi y Visual Da Vinci.


De Guisti. Armando. 2001. editorial: Prentice Hall. ISBN: 987-9460-64-2. Capitulo 7.

PROGRAMACIN; Castor F. Herrmann,Mara E. Valesani.; 2001; Editorial: MOGLIA


S.R.L..ISBN: 9874338326. Capitulo 4.

ESTRUCTURA DE DATOS; Cair y Guardati; 2002; Editorial: MCGRAW-HILL. ISBN:


9701035348. Capitulo 11.

Fundamentos de programacin. Algoritmos, estructuras de datos y objetos; Luis Joyanes


Aguilar; 2008; Editorial: MCGRAW-HILL. ISBN: 8448136642. Captulo 14.

ALGORITMOS Y PROGRAMACION EN PASCAL. Cristobal Parejas Flores y otros.

En internet
http://exa.unne.edu.ar/informatica/programacion1/public_html/
http://web.austral.edu.ar/austral-admisionesGradoingenieriaInformatica.asp
http://www.cepec.edu.ar/informatica.html?gclid=CMj29q_i6QCFdhA2godpQ0oHA
http://www.frgp.utn.edu.ar/carreras/tssi/index.php
http://www.mitecnologico.com/Main/RecursividadProgramacion

Ejecucin de Soluciones a problemas recursivos


implementados en Pascal
Funcin Factorial
Serie de Fibonacci
Torres de Hanoi
Ej. Recursividad Mutua
Gracias

Ejemplo 3: Torres de Hanoi


Un problema tpico a resolver con recursin es el de las Torres de
Hanoi, ya que al aplicar esta herramienta el problema se simplifica
enormemente. Las Torres de Hani es un rompecabezas o juego
matemtico inventado en 1883 por el matemtico francs duard
Lucas

Consiste en tres varillas verticales y un nmero indeterminado de discos que


determinarn la complejidad de la solucin. No hay dos discos iguales, estn
colocados de mayor a menor en la primera varilla ascendentemente, y no se
puede colocar ningn disco mayor sobre uno menor a l en ningn
momento..

Llamaremos A, B y C a cada una de las agujas sin importar el orden


siempre que se mantengan los nombres.
Consideremos inicialmente dos discos en A que queremos pasar a B
utilizando C como auxiliar. Las operaciones por realizar son
sencillas:

Ahora supongamos que tenemos tres discos en A y queremos


pasarlos a B.
Haciendo algunos tanteos descubrimos que hay que pasar los dos
discos superiores de A a C, mover el ltimo disco de A a B y por
ltimo pasar los dos discos de C a B. Ya conocemos cmo pasar dos
discos de A a B usando C como auxiliar, para pasarlos de A a C
usaremos B como varilla auxiliar y para pasarlos de C a B usaremos
A como auxiliar:

En general, Pasar n discos de A a B, consiste en


efectuar las siguientes operaciones

siendo 1 el caso base, que consiste en mover simplemente un disco sin generar llamada
recursiva. Ahora apreciamos claramente la naturaleza recursiva de proceso, pues para
pasar n discos es preciso pasar n-1 discos (dos veces), para n-1 habr que pasar n-2
(tambin dos veces) y as sucesivamente.

También podría gustarte