Sunteți pe pagina 1din 36

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?




Introduccin



El concepto de recursin aparece en varias situaciones de la vida
cotidiana, aunque en muchas no sabemos que estamos en
presencia de este concepto, por ejemplo, sacar fotocopias de
fotocopias, tomar una fotografa a otra fotografa.



La recursin como herramienta de programacin permite definir un
objeto (por ejemplo una estructura de datos - en trminos de si
mismo. Un caso concreto de recursin ya visto en apartados
anteriores son las listas circulares, en donde una lista se llama a si
misma.



Un ejemplo clsico en matemtica es el factorial de un nmero,
potencia o la serie de Fibonacci.
Recursividad





Concepto


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. Un procedimiento o funcin es recursivo
cuando durante una invocacin a l puede ser invocado a su vez l mismo.


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.
Recursividad


Entonces:


Base: La secuenciacin, iteracin condicional y seleccin son estructuras vlidas
de control que pueden ser consideradas como enunciados.


Regla recursiva: Las estructuras de control que se pueden formar combinando de
manera vlida la secuenciacin iteracin condicional y seleccin tambin son
vlidos.
Un conjunto de objetos est definido recursivamente siempre que:
(B) algunos elementos del conjunto se especifican explcitamente
(R) el resto de los elementos del conjunto se definen en trminos de los lementos
ya definidos, donde


(B) se llama base
(R) se llama clusula recursiva
Recursividad



Observaciones:


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
base eventualmente se alcanzar.


Aplicaciones


La recursividad es un mtodo poderoso usado en inteligencia artificial, su poder
es que algunos conceptos complejos pueden expresarse en una forma simple.


Las frmulas recursivas pueden aplicarse a situaciones tales como prueba de
teoremas, solucin de problemas combinatorios, algunos acertijos, etc.
Recursividad como tcnica de Programacin





Una Tcnica de programacin que tiene su origen en
ciertos clculos matemticos.




Consiste en describir los clculos (o acciones) de una
manera autoalusiva (resolver problemas
describindoles en trminos de ejemplares mas
sencillos de si mismos.




Esta tcnica puede entenderse como un caso
particular de programacin estructurada.
Un ejemplo de referencia

Consideremos el clculo del factorial de un entero positivo n que se define de
la siguiente forma:




Como, a su vez,


tenemos que n! se puede definir en trminos de (n - 1)!, para

n > 0, as:



siendo por definicin 0! = 1, lo que permite terminar correctamente los clculos.
Por ejemplo, al calcular el factorial de 3:






Por lo tanto, si n es distinto de cero tendremos
que calcular el factorial de n - 1, y si es cero el
factorial es directamente 1:















La definicin anterior podemos escribirla en Diagrama de Flujo,
Pseudo y su correspondiente codificacin en Pascal





























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:




En resumen



Los subprogramas recursivos se caracterizan por la posibilidad de
invocarse as mismos.



Debe existir al menos un valor del parmetro sobre el que se hace la
recursin, llamado caso base, que no provoca un nuevo clculo
recursivo, con lo que finaliza y puede obtenerse la solucin; en el
ejemplo del factorial, es el cero.



Si este valor no existe, el clculo no termina. Los restantes se llaman
casos recurrentes, y son aqullos para los que s se produce un nuevo
clculo recursivo; en el ejemplo, se trata de los valores positivos 1, 2,
3. . .



En las sucesivas llamadas recursivas los argumentos deben aproximarse a
los casos base,





Esquema de llamadas de Fac








El proceso de ejecucin de un subprograma recursivo consiste en una cadena
de generacin de llamadas (suspendindose los restantes clculos) y
reanudacin de los mismos al trmino de la ejecucin de las llamadas








Para comprender mejor el funcionamiento de un subprograma
recursivo, recordemos el proceso de llamada a un subprograma
cualquiera:



Se reserva el espacio en memoria necesario para almacenar los
parmetros y los dems objetos locales del subprograma.



Se reciben los parmetros y se cede la ejecucin de instrucciones al
subprograma, que comienza a ejecutarse.



Al terminar ste, se libera el espacio reservado, los identificadores
locales dejan de tener vigencia y pasa a ejecutarse la instruccin
siguiente a la de llamada.












En el caso de un subprograma recursivo, cada llamada genera un nuevo ejemplar del
subprograma con sus correspondientes objetos locales. Podemos imaginar cada
ejemplar como una copia del subprograma en ejecucin.


El subprograma comienza a ejecutarse normalmente y, al llegar a la llamada, se
reserva espacio para una nueva copia de sus objetos locales y parmetros. Estos
datos particulares de cada ejemplar generado se agrupan en la llamada tabla de
activacin del subprograma.


El nuevo ejemplar del subprograma pasa a ejecutarse sobre su tabla de activacin,
que se amontona sobre las de las llamadas recursivas anteriores formando la
llamada pila recursiva.


Este proceso termina cuando un ejemplar no genera ms llamadas recursivas por
consistir sus argumentos en casos bsicos.


Entonces, se libera el espacio reservado para la tabla 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.


En toda definicin
recursiva de un
problema se debe
establecer un estado
bsico. Es decir un
estado en el cual la
solucin no se presente
de manera recursiva,
sino directamente.
Adems la entrada
(datos) del problema
debe ir acercndose al
estado bsico.
Cmo funciona la recursividad?

4!=4*3! 3!=3*2!
2!=2*1!



1!=1*0!=1*1
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.
Funcionamiento Interno del Ej. Factorial


Funcionamiento Interno del Ej. Factorial

Cuando esta funcin es invocada, por ejemplo, para hallar el factorial
del nmero 3, se crean en la memoria de la computadora las
siguientes instancias:





y al finalizar comienza el retorno a la invocacin anterior efectundose las acciones que
haban quedado pendientes.:








Ejemplo 2: Serie de Fobonaci
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.
Correccin de subprogramas recursivos






En este apartado presentaremos los conceptos y tcnicas necesarias para la
verificacin (o derivacin) de subprogramas recursivos.



En este sentido, la pauta viene dada por la consideracin de que 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, que encontraremos en este libro.



El proceso de anlisis de la correccin de subprogramas recursivos puede ser
dividido, a nuestro entender, 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.








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.
Recursin mutua

Cuando un subprograma llama a otro y ste a su vez
al primero, se produce lo que se denomina recursin
mutua o cruzada, que consiste en que un
subprograma provoque una llamada a s mismo,
indirectamente, a travs de otro u otros
subprogramas.



En estos casos, se presenta un problema para definir
los subprogramas, porque uno de ellos tendr que
ser definido antes del otro, y la llamada que haga al
segundo se hace a un identificador desconocido,
contraviniendo la norma de Pascal por la que un
identificador tiene que ser declarado antes de usarlo.
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 un poquito ms
que los iterativos porque cuando el compilador llama a una subrutina
guarda todas las variables locales.


En consecuencia, Cules son las razones para elegir la recursin?



La razn fundamental es que existen numerosos problemas complejos que
poseen naturaleza recursiva y, en consecuencia, son ms fciles de
implementar con algoritmos de este tipo. Sin embargo, en condiciones
crticas de tiempo y de memoria, es decir, cuando el consumo de tiempo y
memoria sean decisivos o concluyentes para la resolucin del problema, la
solucin a elegir debe ser, normalmente la iterativa.
Recursividad versus iteracin



La recursividad y la iteracin (ejecucin en bucle) estn muy relacionadas,
cualquier accin que pueda realizarse con la recursividad puede realizarse
con iteracin y viceversa. Normalmente, un clculo determinado se prestar
a una tcnica u otra, slo necesita elegir el enfoque ms natural o con el que
se sienta ms cmodo.


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 mientras que la recursin
termina cuando se reconoce un caso base o la condicin de salida se alcanza.
Recursividad versus iteracin






Ventajas y desventajas

Ventajas de la Recursin


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.

BIBLIOGRAFIA. Especifica:



Fundamentos de programacin. Algoritmos, estructuras de datos y objetos; Luis Joyanes
Aguilar; 2003; Editorial: MCGRAW-HILL. ISBN: 8448136642.



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



ANALISIS Y DISEO DE ALGORITMOS: UN ENFOQUE TEORICO PRACTICO. Dr. Jose I. Pelaez.
2003. Editorial: UMA. ISBN: 84-7496-971-9.



PROGRAMACIN; Castor F. Herrmann,Mara E. Valesani.; 2001; Editorial: MOGLIA
S.R.L..ISBN: 9874338326.



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


W. I. Salmon. Introduccin a la computacin con Turbo Pascal. Addison-Wesley Iberoamericana, 1993.
J. Castro, F. Cucker, F. Messeguer, A. Rubio, Ll. Solano, y B. Valles. Curso de programacin. McGraw-Hill, 1993.


Se ofrecen buenos enfoques de la programacin con subprogramas. El primero de ellos introduce los subprogramas antes incluso
que las instrucciones estructuradas. El segundo ofrece una concrecin de los conceptos de programacin modular
explicados en los lenguajes C y Modula-2.

S. Alagc y M.A. Arbib. The design of well-structured and correct programs. Springer Verlag, 1978.
Es una referencia obligada entre los libros orientados hacia la verificacin con un enfoque formal.

R. S. Pressman. Ingeniera del Software. Un enfoque prctico. McGraw-Hill, 2005.
Algunos de los conceptos contenidos en el tema provienen de la ingeniera del software.

S. Wiedenbeck. Learning recursion as a concept and as a programming technique. Communications of the ACM, 1988.
G. Ford. A framework for teaching recursion. SIGCSE Bulletin of the ACM, 14(2):32{39, July 1982.
La recursin es un concepto difcil de explicar y comprender, que se presenta frecuentemente relacionndolo con la iteracin, a
partir de ejemplos que admiten versiones iterativas y recursivas similares.

L. Rade y R. D. Nelson. Adventures with your computer. Penguin Books Ltd., Middlesex, Gran Breta~na, 1988.
Puede leerse la historia completa sobre las torres de Hanoi y los grandes logros del famoso matemtico francs E. Lucas, entre
otros muchos temas matemticos, que se presentan con una pequea introduccin histrica.

G. G. Early y D. F. Stanat. Chinese rings and recursion. SIGCSE Bulletin of the ACM, 17(4), 1985.
Existe un problema similar al de las Torres de Hanoi, llamado de los anillos chinos, cuya solucin est desarrollada en [ES85] y en
[Dew85b]
En internet



http://exa.unne.edu.ar/informatica/programacion1/
public_html/
http://web.austral.edu.ar/austral-admisionesGrado-
ingenieriaInformatica.asp
http://www.cepec.edu.ar/informatica.html?gclid=C
Mj29-q_i6QCFdhA2godpQ0oHA
http://www.frgp.utn.edu.ar/carreras/tssi/index.php
http://www.mitecnologico.com/Main/RecursividadPr
ogramacion
Ejecucin de Soluciones a problemas recursivos
implementados en Pascal


Funcin Factorial










Serie de Fibonacci









Torres de Hanoi