Sei sulla pagina 1di 37

Tema VII. Recursividad. Recursividad. Concepto. Recursividad directa e indirecta. Recursividad versus iteracin. Recursividad infinita.

Ejemplos de problemas de recursividad. Ventajas y desventajas.

Mgter. Oscar Adolfo Vallejos FaCENA - UNNE

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?

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
Concepto
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
Concepto 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 correspondiente 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-admisionesGradoingenieriaInformatica.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

Potrebbero piacerti anche