recursividad

65
Premisas Las definiciones recursivas suelen responder a funciones que se definen en base a un caso menor de sí mismas. Pero la recursividad en programación tiene otras implicaciones. • Substancial diferencia entre una función matemática y un función programada. La recursividad en programación, aunque está permitida en prácticamente todos los lenguajes modernos, no es una herramienta demasiado útil en un entorno productivo.

Upload: zsol-zsol

Post on 26-Dec-2015

9 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: 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 programación tiene otras implicaciones.

• Substancial diferencia entre una función matemática y unfunción programada.

• La recursividad en programación, aunque está permitida en prácticamente todos los lenguajes modernos, no es una herramienta demasiado útil en un entorno productivo.

• ¿Cuándo debo utilizar entonces recursividad?

Page 2: recursividad

Introducción

• El concepto de recursión 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 fotografía a otra fotografía.

• La recursión como herramienta de programación permite definir un objeto (por ejemplo una estructura de datos - en términos de si mismo. Un caso concreto de recursión ya visto en apartados anteriores son las listas circulares, en donde una lista se llama a si misma.

• Un ejemplo clásico en matemática es el factorial de un número, potencia o la serie de Fibonacci.

Page 3: recursividad

RecursividadConcepto

• 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 programación, al concepto de procedimiento o función. Un procedimiento o función es recursivo cuando durante una invocación a él puede ser invocado a su vez él mismo.

• La recursividad es una de las formas de control más importantes en la programación. Los procedimientos recursivos son la forma más natural de representación de muchos algoritmos.

• Un razonamiento recursivo tiene dos partes: la base y la regla recursiva de construcción. La base no es recursiva y es el punto tanto de partida como de terminación de la definición.

Page 4: recursividad

Recursividad

Entonces:

Base: La secuenciación, iteración condicional y selección son estructuras válidas de control que pueden ser consideradas como enunciados.

Regla recursiva: Las estructuras de control que se pueden formar combinando de manera válida la secuenciación iteración condicional y selección también son válidos.

Un conjunto de objetos está definido recursivamente siempre que:

(B) algunos elementos del conjunto se especifican explícitamente(R) el resto de los elementos del conjunto se definen en términos de los lementos ya definidos, donde

(B) se llama base(R) se llama cláusula recursiva

Page 5: recursividad

Recursividad

Observaciones:

1. El procedimiento se llama a si mismo2. El problema se resuelve, resolviendo el mismo problema pero de tamaño

menor3. La manera en la cual el tamaño del problema disminuye asegura que el caso base eventualmente se alcanzará.

Aplicaciones

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

Las fórmulas recursivas pueden aplicarse a situaciones tales como prueba de teoremas, solución de problemas combinatorios, algunos acertijos, etc.

Page 6: recursividad

Recursividad como técnica de Programación

• Una Técnica de programación que tiene su origen en ciertos cálculos matemáticos.

• Consiste en describir los cálculos (o acciones) de una manera autoalusiva (resolver problemas describiéndoles en términos de ejemplares mas sencillos de si mismos.

• Esta técnica puede entenderse como un caso particular de programación estructurada.

Page 7: recursividad

Un ejemplo de referencia

Consideremos el cálculo del factorial de un entero positivo n que se define dela siguiente forma:

Como, a su vez,

tenemos que n! se puede definir en términos de (n - 1)!, para n > 0, así:

siendo por definición 0! = 1, lo que permite terminar correctamente los cálculos.Por ejemplo, al calcular el factorial de 3:

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

Page 8: recursividad

La definición anterior podemos escribirla en Diagrama de Flujo,Pseudo y su correspondiente codificación en Pascal …

Page 9: recursividad

Al ejecutarlo sobre el argumento 4, se producela cadena de llamadas sucesivas aFac(4), Fac(3), Fac (2), Fac(1) y a Fac(0), así:

Page 10: recursividad

En resumen

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

Debe existir al menos un valor del parámetro sobre el que se hace la recursión, llamado caso base, que no provoca un nuevo cálculo recursivo, con lo que finaliza y puede obtenerse la solución; en el ejemplo del factorial, es el cero.

Si este valor no existe, el cálculo no termina. Los restantes se llaman casos recurrentes, y son aquéllos para los que sí se produce un nuevo cálculo recursivo; en el ejemplo, se trata de los valores positivos 1, 2,3. . .

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

Page 11: recursividad

Esquema de llamadas de Fac

El proceso de ejecución de un subprograma recursivo consiste en una cadena de generación de llamadas (suspendiéndose los restantes cálculos) y reanudación de los mismos al término de la ejecución de las llamadas

Page 12: recursividad

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 parámetros y los demás objetos locales del subprograma.

• Se reciben los parámetros y se cede la ejecución 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 instrucción siguiente a la de llamada.

Page 13: recursividad
Page 14: recursividad

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 ejecución.

• El subprograma comienza a ejecutarse normalmente y, al llegar a la llamada, se reserva espacio para una nueva copia de sus objetos locales y parámetros. Estos datos particulares de cada ejemplar generado se agrupan en la llamada tabla de activación del subprograma.

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

• Este proceso termina cuando un ejemplar no genera más llamadas recursivas por consistir sus argumentos en casos básicos.

• Entonces, se libera el espacio reservado para la tabla de activación de ese ejemplar, reanudándose las instrucciones del subprograma anterior sobre la tabla penúltima.

• Este proceso de retorno finaliza con la llamada inicial.

Page 15: recursividad

Recursión Directa e Indirecta

Directa: El subprograma se llama directamentea si mismo.

Page 16: recursividad

Recursión Directa e IndirectaIndirecta: 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 recursión 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 ejecución C vuelve a donde fue llamado B y este a su vez al subprograma A – programa inicio.

En toda definición recursiva de un problema se debe establecer un estado básico. Es decir un estado en el cual la solución no se presente de manera recursiva, sino directamente. Además la entrada (datos) del problema debe ir acercándose al estado básico.

Page 17: recursividad

¿Cómo funciona la recursividad?4!=4*3! 3!=3*2! 2!=2*1!

1!=1*0!=1*1

Page 18: recursividad

Recursividad Infinita

Recursividad Infinita

• Es muy importante que toda función recursiva tenga un caso en el que no se llame a sí misma, o las llamadas serían infinitas y el programa no tendría fin.

• Por eso, siempre una función recursiva tiene una condición inicial en la que no debe llamarse a sí misma.

Page 19: recursividad

Funcionamiento Interno del Ej. Factorial

Page 20: recursividad

Funcionamiento Interno del Ej. FactorialCuando esta función es invocada, por ejemplo, para hallar el factorial

del número 3, se crean en la memoria de la computadora las siguientes instancias:

y al finalizar comienza el retorno a la invocación anterior efectuándose las acciones quehabían quedado pendientes.:

Page 21: recursividad

Ejemplo 2: Serie de Fobonaci

Page 22: recursividad

Ejemplo 3: Torres de HanoiUn problema típico a resolver con recursión es el de las Torres de

Hanoi, ya que al aplicar esta herramienta el problema se simplifica enormemente. Las Torres de Hanói es un rompecabezas o juego matemático inventado en 1883 por el matemático francés Éduard Lucas

Consiste en tres varillas verticales y un número indeterminado de discos que determinarán la complejidad de la solución. No hay dos discos iguales, están colocados de mayor a menor en la primera varilla ascendentemente, y no se puede colocar ningún disco mayor sobre uno menor a él en ningún momento..

Page 23: recursividad

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:

Page 24: recursividad

• 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 cómo 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:

Page 25: recursividad

En general, Pasar n discos de A a B, consiste enefectuar 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 (también dos veces) y así sucesivamente.

Page 26: recursividad

Corrección de subprogramas recursivos

En este apartado presentaremos los conceptos y técnicas necesarias para la verificación (o derivación) de subprogramas recursivos.

En este sentido, la pauta viene dada por la consideración de que un subprograma recursivo no es más que un caso particular de subprograma en el que aparecen llamadas a sí mismo. Esta peculiaridad hace que tengamos que recurrir a alguna herramienta matemática, de aplicación no demasiado complicada en la mayoría de los casos, que encontraremos en este libro.

El proceso de análisis de la corrección de subprogramas recursivos puede ser dividido, a nuestro entender, en dos partes: una primera, en la que consideraremos los pasos de la verificación comunes con los subprogramas no recursivos, y una segunda con los pasos en los que se aplican técnicas específicas de verificación de la recursión.

Page 27: recursividad

En resumen, para demostrar la corrección de un subprograma recursivo hemos de comprobar:

• La corrección del caso base.

• La corrección de los casos recurrentes. Para ello, se supone la de las llamadas subsidiarias, como ocurre en el paso inductivo con la hipótesis de inducción.

• Que las llamadas recursivas se hacen de manera que los parámetros se acercan al caso base; por ejemplo, en el cálculo del factorial, en las sucesivas llamadas los parámetros son n; n - 1;…., que desembocan en el caso base 0, siempre que n > 0, lo cual se exige en la condición previa de la función.

Page 28: recursividad

Recursión mutua

• Cuando un subprograma llama a otro y éste a su vez al primero, se produce lo que se denomina recursión mutua o cruzada, que consiste en que un subprograma provoque una llamada a sí mismo, indirectamente, a través 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 unidentificador tiene que ser declarado antes de usarlo.

Page 29: recursividad

Recursividad versus iteración

Si un subprograma se llama a si mismo se repite su ejecución un cierto numero de veces.

Los procesos recursivos suelen ocupar más memoria y tardar un poquito más que los iterativos porque cuando el compilador llama a una subrutina guarda todas las variables locales.

En consecuencia, ¿Cuáles son las razones para elegir la recursión?

La razón fundamental es que existen numerosos problemas complejos que poseen naturaleza recursiva y, en consecuencia, son más fáciles de implementar con algoritmos de este tipo. Sin embargo, en condiciones críticas de tiempo y de memoria, es decir, cuando el consumo de tiempo y memoria sean decisivos o concluyentes para la resolución del problema, la solución a elegir debe ser, normalmente la iterativa.

Page 30: recursividad

Recursividad versus iteraciónLa recursividad y la iteración (ejecución en bucle) están muy relacionadas,

cualquier acción que pueda realizarse con la recursividad puede realizarse con iteración y viceversa. Normalmente, un cálculo determinado se prestará a una técnica u otra, sólo necesita elegir el enfoque más natural o con el que se sienta más cómodo.

Tanto la iteración como la recursión se basan en una estructura de control:

- la iteración utiliza una estructura repetitiva- la recursión utiliza una estructura de selección.

La iteración y la recursión implican ambas repetición:

- la iteración utiliza explícitamente una estructura repetitiva- la recursión consume la repetición mediante llamadas repetidas.

La iteración y la recursión implican cada una un test mientras que la recursióntermina cuando se reconoce un caso base o la condición de salida se alcanza.

Page 31: recursividad

Recursividad versus iteración

Page 32: recursividad

Ventajas y desventajasVentajas de la Recursión

Soluciones simples, clarasSoluciones elegantes.Soluciones a problemas complejos.

Desventajas de la Recursión: 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 fácil solución iterativa.- La ineficiencia inherente de algunos algoritmos recursivos.

La recursividad se debe usar cuando sea realmente necesaria, es decir, cuando no existauna solución iterativa simple.

Page 33: recursividad

BIBLIOGRAFIA. Especifica:

• Fundamentos de programación. Algoritmos, estructuras de datos y objetos; Luis JoyanesAguilar; 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 DISEÑO DE ALGORITMOS: UN ENFOQUE TEORICO PRACTICO. Dr. Jose I. Pelaez.2003. Editorial: UMA. ISBN: 84-7496-971-9.

• PROGRAMACIÓN; Castor F. Herrmann,María E. Valesani.; 2001; Editorial: MOGLIA S.R.L..ISBN: 9874338326.

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

Page 34: recursividad

BIBLIOGRAFIA. General

W. I. Salmon. Introducción a la computación con Turbo Pascal. Addison-Wesley Iberoamericana, 1993.J. Castro, F. Cucker, F. Messeguer, A. Rubio, Ll. Solano, y B. Valles. Curso de programación. McGraw-Hill, 1993.

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

S. Alagíc 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 verificación con un enfoque formal.

R. S. Pressman. Ingeniería del Software. Un enfoque práctico. McGraw-Hill, 2005. Algunos de los conceptos contenidos en el tema provienen de la ingeniería 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 recursión es un concepto difícil de explicar y comprender, que se presenta frecuentemente relacionándolo con la iteración,

a partir de ejemplos que admiten versiones iterativas y recursivas similares.

L. Rºade 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 matemático francés E. Lucas,

entre otros muchos temas matemáticos, que se presentan con una pequeña introducción histórica.

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 solución está desarrollada en [ES85] y en

[Dew85b]

Page 35: recursividad

En internet …

• h t tp:/ / e x a.unne.edu.ar/i n f orm a ti c a/p r og r amacion1/ public_html/

• h t tp:// w eb.au s t r al.edu.ar / au s t r a l - admisionesG r ado - in g eni e ri a I n f orm a t i c a.asp

• h t tp://w w w .cep e c.edu. a r/i n f orm a ti c a. h tml? g cli d =C Mj2 9 - q_i6QC F dhA 2 g odpQ0oH A

• h t tp://w w w . f r gp.utn.edu.ar / c ar r e r as/tssi/ind e x.p h p • h t tp://w w w .mi t ecno l ogi c o. c om/Main/ R ecu r sividadPr

og r amac i on

Page 36: recursividad

Ejecución de Soluciones a problemas recursivosimplementados en Pascal

• Función Factorial

• Serie de Fibonacci

• Torres de Hanoi