You are on page 1of 37

Tema VII. Recursividad. Recursividad. Concepto. Recursividad directa e indirecta. Recursividad versus iteración. 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 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. • ¿Cuándo debo utilizar entonces recursividad?

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.

Recursividad Concepto • • Un programa o subprograma que se llama a si mismo se dice que es recursivo. Los procedimientos recursivos son la forma más natural de representación de muchos algoritmos. en los lenguajes de programación. El concepto de recursividad está ligado. La base no es recursiva y es el punto tanto de partida como de terminación de la definición. • • . Un procedimiento o función es recursivo cuando durante una invocación a él puede ser invocado a su vez él mismo. al concepto de procedimiento o función. Un razonamiento recursivo tiene dos partes: la base y la regla recursiva de construcción. La recursividad es una de las formas de control más importantes en la programación.

iteración condicional y selección son estructuras válidas de control que pueden ser consideradas como enunciados. donde (B) se llama base (R) se llama cláusula recursiva .Recursividad Concepto Entonces: Base: La secuenciación. 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. 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.

algunos acertijos. etc. El procedimiento se llama a si mismo 2. Las fórmulas recursivas pueden aplicarse a situaciones tales como prueba de teoremas. resolviendo el mismo problema pero de tamaño menor 3. El problema se resuelve. su poder es que algunos conceptos complejos pueden expresarse en una forma simple. 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. solución de problemas combinatorios. .Recursividad Concepto Observaciones: 1.

. • 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.Recursividad como técnica de Programación • Una Técnica de programación que tiene su origen en ciertos cálculos matemáticos. • Esta técnica puede entenderse como un caso particular de programación estructurada.

Por ejemplo. al calcular el factorial de 3: Por lo tanto. si n es distinto de cero tendremos que calcular el factorial de n . así: siendo por definición 0! = 1. para n > 0. y si es cero el factorial es directamente 1: . tenemos que n! se puede definir en términos de (n .1.Un ejemplo de referencia Consideremos el cálculo del factorial de un entero positivo n que se define de la siguiente forma: Como. lo que permite terminar correctamente los cálculos.1)!. a su vez.

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

Fac(1) y a Fac(0). se produce la cadena de llamadas sucesivas a Fac(4). Fac(3). así: . Fac (2).Al ejecutarlo sobre el argumento 4.

2. con lo que finaliza y puede obtenerse la solución. el cálculo no termina. . llamado caso base. en el ejemplo del factorial. 3. Debe existir al menos un valor del parámetro sobre el que se hace la recursión. en el ejemplo. y son aquéllos para los que sí se produce un nuevo cálculo recursivo. se trata de los valores positivos 1. En las sucesivas llamadas recursivas los argumentos deben aproximarse a los casos base. es el cero. Los restantes se llaman casos recurrentes. que no provoca un nuevo cálculo recursivo.En resumen Los subprogramas recursivos se caracterizan por la posibilidad de invocarse así mismos. . Si este valor no existe. .

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 .

• Al terminar éste. 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. se libera el espacio reservado. que comienza a ejecutarse. los identificadores locales dejan de tener vigencia y pasa a ejecutarse la instrucción siguiente a la de llamada.Para comprender mejor el funcionamiento de un subprograma recursivo.

.

• • • • . Este proceso termina cuando un ejemplar no genera más llamadas recursivas por consistir sus argumentos en casos básicos. • El subprograma comienza a ejecutarse normalmente y. Podemos imaginar cada ejemplar como una copia del subprograma en ejecución. se reserva espacio para una nueva copia de sus objetos locales y parámetros. que se amontona sobre las de las llamadas recursivas anteriores formando la llamada pila recursiva. cada llamada genera un nuevo ejemplar del subprograma con sus correspondiente objetos locales. Estos datos particulares de cada ejemplar generado se agrupan en la llamada tabla de activación del subprograma. se libera el espacio reservado para la tabla de activación de ese ejemplar. al llegar a la llamada. Entonces. Este proceso de retorno finaliza con la llamada inicial. El nuevo ejemplar del subprograma pasa a ejecutarse sobre su tabla de activación. reanudándose las instrucciones del subprograma anterior sobre la tabla penúltima.En el caso de un subprograma recursivo.

.Recursión Directa e Indirecta Directa: El subprograma se llama directamente a si mismo.

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. Además la entrada (datos) del problema debe ir acercándose al estado básico. Es decir un estado en el cual la solución no se presente de manera recursiva. Otro caso de recursión indirecta es el caso b) de la figura.Recursión 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. . que muestra como un subprograma llama a otro y este a un tercero y una vez ejecutado el subprograma vuelve a donde fue llamado. sino directamente. En el ejemplo de la figura el programa A llama al B y este al C.

¿Cómo 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 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.

Funcionamiento Interno del Ej. Factorial .

: . 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 que habían quedado pendientes. para hallar el factorial del número 3. por ejemplo.Funcionamiento Interno del Ej. Factorial Cuando esta función es invocada.

Ejemplo 2: Serie de Fobonaci .

. y no se puede colocar ningún disco mayor sobre uno menor a él en ningún momento. están colocados de mayor a menor en la primera varilla ascendentemente. ya que al aplicar esta herramienta el problema se simplifica enormemente.Ejemplo 3: Torres de Hanoi Un problema típico a resolver con recursión es el de las Torres de Hanoi. 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.

Llamaremos A. B y C a cada una de las agujas sin importar el orden siempre que se mantengan los nombres. Las operaciones por realizar son sencillas: . Consideremos inicialmente dos discos en A que queremos pasar a B utilizando C como auxiliar.

• Haciendo algunos tanteos descubrimos que hay que pasar los dos discos superiores de A a C. para pasarlos de A a C usaremos B como varilla auxiliar y para pasarlos de C a B usaremos A como auxiliar: .• Ahora supongamos que tenemos tres discos en A y queremos pasarlos a B. 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.

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). Pasar n discos de A a B. para n-1 habrá que pasar n-2 (también dos veces) y así sucesivamente.En general. .

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. y una segunda con los pasos en los que se aplican técnicas específicas de verificación de la recursión. que encontraremos en este libro. en la que consideraremos los pasos de la verificación comunes con los subprogramas no recursivos. en dos partes: una primera.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. . a nuestro entender. de aplicación no demasiado complicada en la mayoría de los casos. El proceso de análisis de la corrección de subprogramas recursivos puede ser dividido.

En resumen.…. La corrección de los casos recurrentes. como ocurre en el paso inductivo con la hipótesis de inducción. en las sucesivas llamadas los parámetros son n. siempre que n > 0. se supone la de las llamadas subsidiarias.. . Para ello. para demostrar la corrección de un subprograma recursivo hemos de comprobar: • • La corrección del caso base. lo cual se exige en la condición previa de la función.1. n . en el cálculo del factorial. • Que las llamadas recursivas se hacen de manera que los parámetros se acercan al caso base. que desembocan en el caso base 0. por ejemplo.

se produce lo que se denomina recursión mutua o cruzada. indirectamente. . se presenta un problema para definir los subprogramas. a través de otro u otros subprogramas. que consiste en que un subprograma provoque una llamada a sí mismo. • En estos casos.Recursión mutua • Cuando un subprograma llama a otro y éste a su vez al primero. 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. porque uno de ellos tendrá que ser definido antes del otro.

en condiciones críticas de tiempo y de memoria. son más fáciles de implementar con algoritmos de este tipo. es decir. la solución a elegir debe ser. en consecuencia.Recursividad versus iteración Si un subprograma se llama a si mismo se repite su ejecución un cierto numero de veces. Sin embargo. ¿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. 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. normalmente la iterativa. . cuando el consumo de tiempo y memoria sean decisivos o concluyentes para la resolución del problema.

la iteración utiliza una estructura repetitiva . . un cálculo determinado se prestará a una técnica u otra. Normalmente. Tanto la iteración como la recursión se basan en una estructura de control: .la recursión utiliza una estructura de selección. sólo necesita elegir el enfoque más natural o con el que se sienta más cómodo. La iteración y la recursión implican ambas repetición: .la iteración utiliza explícitamente una estructura repetitiva . cualquier acción que pueda realizarse con la recursividad puede realizarse con iteración y viceversa. La iteración y la recursión implican cada una un test mientras que la recursión termina cuando se reconoce un caso base o la condición de salida se alcanza.Recursividad versus iteración La recursividad y la iteración (ejecución en bucle) están muy relacionadas.la recursión consume la repetición mediante llamadas repetidas.

Recursividad versus iteración .

Ventajas y desventajas Ventajas de la Recursión Soluciones simples. (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. . es decir. Desventajas de la Recursión: INEFICIENCIA Sobrecarga asociada con las llamadas a subalgoritmos • Una simple llamada puede generar un gran numero de llamadas recursivas. claras Soluciones elegantes. . Soluciones a problemas complejos. cuando no exista una solución iterativa simple. La recursividad se debe usar cuando sea realmente necesaria.

Editorial: MCGRAW-HILL. 2002. Delphi y Visual Da Vinci. Pelaez. Dr.. 2003. estructuras de datos y objetos. ESTRUCTURA DE DATOS..María E. PROGRAMACIÓN. ISBN: 84-7496-971-9. Castor F. Herrmann. • • • • . 2001. Jose I. Editorial: UMA. De Guisti. Valesani. Armando.BIBLIOGRAFIA. ISBN: 8448136642. 2003.R. Cairó y Guardati. DATOS Y PROGRAMAS con aplicaciones en Pascal.L. ALGORITMOS. editorial: Prentice Hall. Editorial: MCGRAW-HILL. Editorial: MOGLIA S. ISBN: 987-9460-64-2 ANALISIS Y DISEÑO DE ALGORITMOS: UN ENFOQUE TEORICO PRACTICO. Algoritmos. Especifica: • Fundamentos de programación. Luis Joyanes Aguilar.ISBN: 9874338326. 2001. ISBN: 9701035348.

F. Un enfoque práctico. SIGCSE Bulletin of the ACM. The design of well-structured and correct programs. Es una referencia obligada entre los libros orientados hacia la verificación con un enfoque formal. G. que se presentan con una pequeña introducción histórica. Communications of the ACM. 14(2):32{39.A. R. S.. Introducción a la computación con Turbo Pascal. Castro. 1993. Nelson. McGraw-Hill. I. 1988. Learning recursion as a concept and as a programming technique. S. El segundo ofrece una concreción de los conceptos de programación modular explicados en los lenguajes C y Modula-2. Penguin Books Ltd. G. Solano. Lucas. Addison-Wesley Iberoamericana. a partir de ejemplos que admiten versiones iterativas y recursivas similares. D. Arbib. entre otros muchos temas matemáticos. 17(4). Puede leerse la historia completa sobre las torres de Hanoi y los grandes logros del famoso matemático francés E. Adventures with your computer. S. 2005. G. Valles. Cucker. Middlesex. July 1982. 1993. Pressman. A. Alagíc y M. Se ofrecen buenos enfoques de la programación con subprogramas. SIGCSE Bulletin of the ACM. J. Ford. 1988. Rubio. Messeguer. Curso de programación. F. Ingeniería del Software. Rºade y R. Springer Verlag. F. cuya solución está desarrollada en [ES85] y en [Dew85b] . 1978. Stanat. General W. L. y B. Chinese rings and recursion. Gran Breta~na.BIBLIOGRAFIA. A framework for teaching recursion. Algunos de los conceptos contenidos en el tema provienen de la ingeniería del software. Salmon. McGraw-Hill. La recursión es un concepto difícil de explicar y comprender. 1985. Wiedenbeck. El primero de ellos introduce los subprogramas antes incluso que las instrucciones estructuradas. llamado de los anillos chinos. Early y D. Ll. que se presenta frecuentemente relacionándolo con la iteración. Existe un problema similar al de las Torres de Hanoi.

austral.edu.com/Main/RecursividadPr ogramacion .edu.utn.html?gclid=C Mj29-q_i6QCFdhA2godpQ0oHA • http://www.ar/informatica.edu.En internet … • http://exa.php • http://www.ar/austral-admisionesGradoingenieriaInformatica.unne.edu.asp • http://www.mitecnologico.cepec.frgp.ar/carreras/tssi/index.ar/informatica/programacion1/ public_html/ • http://web.

Ejecución de Soluciones a problemas recursivos implementados en Pascal • Función Factorial • Serie de Fibonacci • Torres de Hanoi .