Tema 7: Recursividad

Documentos relacionados
Recursividad Definición

UNIVERSIDAD DE LOS ANDES NUCLEO UNIVERSITARIO RAFAEL RANGEL (NURR) DEPARTAMENTO DE FISICA Y MATEMATICA AREA COMPUTACION TRUJILLO EDO.

Programación I Recursividad.

Ejercicios sobre recursividad

Programación 2. Lección 3. Introducción a la recursividad

Secuencias Calculadas

Complejidad de algoritmos recursivos

Funciones: Pasos por Referencia Recursividad

M.C. Yolanada Moyao Martínez

Recursividad. Franco Guidi Polanco Escuela de Ingeniería Industrial Pontificia Universidad Católica de Valparaíso, Chile

Programación de sistemas Recursión

Unidad 2 Recursividad. 2.1 Definición 2.2 Procedimientos Recursivos 2.3 Ejemplos de Casos Recursivos

Estructura de Datos. Recursividad. Primer Semestre, Indice

ESTRUCTURA DE DATOS: Tema 3. Recursividad

Unidad 2 Recursividad. 2.1 Definición 2.2 Procedimientos Recursivos 2.3 Ejemplos de Casos Recursivos

Fundamentos de la programación

Práctica 5.- Recursividad

Funciones II. Fundamentos de Programación Fundamentos de Programación I

Programación de sistemas

Estructuras de Datos y de la Información Ingeniería Técnica en Informática de Gestión. Curso 2007/2008 Ejercicios del Tema 2

ESTRUCTURA DE DATOS: Tema 3. Recursividad

Tema 5- Diseño Recursivo y. Objetivos Principales. Bibliografía Básica

Recursión como herramienta en resolución de problemas computacionales

UNIVERSIDAD AUTÓNOMA CHAPINGO DPTO. DE PREPARATORIA AGRÍCOLA ÁREA DE FÍSICA RECURSIÓN. Guillermo Becerra Córdova

Recursión. Capítulo 4

Qué es la recursividad?

La recursividad forma parte del repertorio para resolver problemas en Computación y es de los métodos más poderosos y usados.

4.1 Definición. Se dice que algo es recursivo si se define en función de sí mismo o a sí mismo. Un objeto (problemas, estructuras de datos) es

Matemáticas Discretas II clase 6: Ecuaciones de recurrencia Universidad del valle

Estructura de datos y de la información Boletín de problemas - Tema 9

Tema 1. Recursividad

Tema 3. Recursividad.

Programación II Recursividad Dr. Mario Rossainz López

Recursividad. Dept. Ciencias de la Computación e I.A. Universidad de Granada

Tema 4.- Recursión e iteración

Estructuración del programa en partes más pequeñas y sencillas

Programación 2. Lección 9. Caracterización asintótica de la eficiencia de algoritmos recursivos

Luis Rodríguez Baena Universidad Pontificia de Salamanca Escuela Superior de Ingeniería y Arquitectura

Funciones Tipos de funciones y Recursividad

Resolución de Problemas y Algoritmos Segundo cuatrimestre de 2015 Clase 18: Recursión - Problemas clásicos

TECNICAS DE PROGRAMACION Universidad Católica Los Angeles de Chimbote RECURSIVIDAD Y SOBRECARGA DE METODOS

Universidad de Valladolid. Departamento de informática. Campus de Segovia. Estructura de datos Tema 1: Recursividad. Prof. Montserrat Serrano Montero

Recursividad. Definición de Recursividad: Técnica de programación muy potente que puede ser usada en lugar de la iteración.

Temario. Tipos de recursión. Eficiencia y recursión

Algoritmos y Estructuras de Datos Tema 2: Diseño de Algoritmos

2^6 2^5 2^4 2^3 2^2 2^1 2^0 SUMA

Si un número es múltiplo de otro, u dicho de forma, comprobar si un número es divisor de otro.

Análisis de algoritmos. Recursividad

Tema 7. Recursividad. J.T.P. Maria Eugenia Valesani - Programacion 1 - Fa.Ce.Na.

Listas y Recursión. Taller de Álgebra I. Primer Cuatrimestre de 2015

Recursividad. 1.1 Concepto de Recursividad. Objetivos. Metodología de la Programación II Entender el concepto de recursividad.

Algoritmos y Estructuras de Datos: Introducción a la Recursión de Programas. Guillermo Román Díez

CAPITULO 6: FUNCIONES

UAA Sistemas Electrónicos Estructura de Datos Muñoz / Serna

RECURSIVIDAD. Prof. Ing. M.Sc. Fulbia Torres

Recursividad. Definición. Diseño de Algoritmos Recursivos

Programación Orientada a Objetos Métodos Guía de Ejercicios v9.7

Recursión. Introducción a la Computación Clase 15 Patricia Borensztejn

PROGRAMACION MODULAR FUNCIONES

Recursividad... un análisis posterior. Aurelio Sanabria Introducción a la programación

Práctica 5. Contenido: Subprogramas (funciones y procedimientos). Parámetros por valor y por referencia.

Recursión. Recursión continuación

UNIDAD 7 Recursividad Concepto. Algoritmos recursivos. Seguimiento de la recursión. Algunos métodos recursivos de búsqueda y ordenación: M-Sort y

Alonso Ramírez Manzanares Computación y Algoritmos 10.03

Tema: FUNCIONES, PROCEDIMIENTOS Y RECURSIVIDAD.

Lenguaje de Programación: C++ Repaso de Material C++

PROGRAMACION ESTRUCTURADA: Tema 3. Funciones

Examen escrito de Programación 1. Viernes 22 de enero de Problema 1 o (3.0 puntos) Problema 2 o (3.0 puntos)

Introducción Algoritmos de tipo dividir para vencer Algoritmos de rastreo Inverso. Recursividad. Programación Avanzada. 8 de septiembre de 2017

RECURRENCIA RECURSIÓN o RECURSIVIDAD

TEMA 5: Subprogramas, programación modular

Recursividad... un análisis posterior. Jaime Gutiérrez Alfaro Introducción a la programación

Metodología de la Programación II. Recursividad

Tema 11. Diseño de algoritmos recursivos 1. Tema 11. Diseño de algoritmos recursivos

Bloque 1. Conceptos y técnicas básicas en programación

Ámbito y Funciones. Lenguaje de Programación Estructurado. Siempre imaginé el Paraíso como algún tipo de biblioteca.

Diseño y Análisis de Algoritmos

Trabajo Práctico Nº 13 Tema: RECURSIVIDAD

Tema: Funciones, Procedimientos y Recursividad en C#.

Tema: Funciones, Procedimientos y Recursividad en C#.

Bloque 3. Expresiones, sentencias y estructuras de control

Introducción a la recursividad. Diseño y Análisis de Algoritmos

Programación Estructurada

Algoritmos y Estructuras de Datos Tema 2: Diseño de Algoritmos

Tema: Funciones, Procedimientos y Recursividad en C#.

Departamento de Informática Universidad de Valladolid Campus de Segovia TEMA 1: RECURSIÓN

Divide & Conquer. Herman Schinca. Clase de Junio de 2011

Técnicas de prueba y corrección de algoritmos

PROGRAMACIÓN PRÁCTICA AUTOR: JUAN LUIS ARELLANO ESCAMILLA

Programación 1 Tema 5. Instrucciones simples y estructuradas

BOLETÍN DE EJERCICIOS: PROGRAMACIÓN EN C++ Ejercicio 1.- escribir un programa que calcule el factorial de un número:

Tema 06: Recursividad

Tema: Funciones, Procedimientos y Recursividad en C#.

UNIVERSIDAD AUTÓNOMA DEL ESTADO DE MÉXICO CENTRO UNIVERSITARIO UAEM ATLACOMULCO INGENIERÍA EN COMPUTACIÓN

Carlos A. Rivera-Morales. Precálculo 2

dit UPM Tema 1: Introducción /recursión Análisis y diseño de software José A. Mañas

Transcripción:

Tema 7: Recursividad Objetivos: en este tema estudiaremos funciones recursivas; esto es, funciones que se invocan a sí mismas. Estas funciones son equivalentes a estructuras tipo bucle pero permiten especificar muchos problemas de un modo más simple y natural que éstos, de ahí su importancia en computación.

Metodología y tecnología de la programación I 2/11 Índice Índice...2 1 Introducción...3 2 Tipos de recursión...3 2.1 Recursión lineal...4 2.1.1 Recursión lineal no final...4 2.1.2 Recursión lineal final...5 2.2 Recursión múltiple...6 2.3 Recursión mutua...7 3 Ejercicios...9 4 Apéndice: las torres de Hanoi...10 4.1 Leyenda sobre las torres de Hanoi...11

Metodología y tecnología de la programación I 3/11 1 Introducción Una función recursiva es una función que se llama a si misma. Esto es, dentro del cuerpo de la función se incluyen llamadas a la propia función. Esta estrategia es una alternativa al uso de bucles. Una solución recursiva es, normalmente, menos eficiente que una solución basada en bucles. Esto se debe a las operaciones auxiliares que llevan consigo las llamadas a las funciones. Cuando un programa llama a una función que llama a otra, la cual llama a otra y así sucesivamente, las variables y valores de los parámetros de cada llamada a cada función se guardan en la pila o stack, junto con la dirección de la siguiente línea de código a ejecutar una vez finalizada la ejecución de la función invocada. Esta pila va creciendo a medida que se llama a más funciones y decrece cuando cada función termina. Si una función se llama a si misma recursivamente un número muy grande de veces existe el riesgo de que se agote la memoria de la pila, causando la terminación brusca del programa. A pesar de todos estos inconvenientes, en muchas circunstancias el uso de la recursividad permite a los programadores especificar soluciones naturales y sencillas que sin emplear esta técnica serían mucho más complejas de resolver. Esto convierte a la recursión en una potente herramienta de la programación. Sin embargo, por sus inconvenientes, debe emplearse con cautela. 2 Tipos de recursión Como regla básica, para que un problema pueda resolverse utilizando recursividad, el problema debe poder definirse recursivamente y, segundo, el problema debe incluir una

Metodología y tecnología de la programación I 4/11 condición de terminación porque, en otro caso, la ejecución continuaría indefinidamente. Cuando la condición de terminación es cierta la función no vuelve a llamarse a si misma. Pueden distinguirse distintos tipos de llamada recursivas dependiendo del número de funciones involucradas y de cómo se genera el valor final. A continuación veremos cuáles son. 2.1 Recursión lineal En la recursión lineal cada llamada recursiva genera, como mucho, otra llamada recursiva. Se pueden distinguir dos tipos de recursión lineal atendiendo a cómo se genera resultado. 2.1.1 Recursión lineal no final En la recursión lineal no final el resultado de la llamada recursiva se combina en una expresión para dar lugar al resultado de la función que llama. El ejemplo típico de recursión lineal no final es cálculo del factorial de un número (n! = n * (n-1) *...* 2 * 1 ). Dado que el factorial de un número n es igual al producto de n por el factorial de n-1, lo más natural es efectuar una implementación recursiva de la función factorial. Veamos una implementación de este cálculo: /* *ejemplo7_1.c */ #include <stdio.h> int factorial(int numero){ if (numero > 1) return (numero*factorial(numero-1)); else return(1); int main (){ int n; printf("introduce el número: "); scanf("%d",&n); printf("el factorial es %d", factorial(n)); para calcular el factorial de 4 esta sería la secuencia de llamadas:

Metodología y tecnología de la programación I 5/11 factorial(4) = 4 * factorial(3) return(4*6) factorial(3) = 3 * factorial(2) return(3*2) factorial(2) = 2 * factorial(1) return (2*1) factorial(1) = 1 return 1; Cada fila del anterior gráfico supone una instancia distinta de ejecución de la función fact. Cada instancia tiene un conjunto diferente de variables locales. 2.1.2 Recursión lineal final En la recursión lineal final el resultado que es devuelto es el resultado de ejecución de la última llamada recursiva. Un ejemplo de este cálculo es el máximo común divisor, que puede hallarse a partir de la fórmula: /* *ejemplo7_2.c */ #include <stdio.h> long mcd(long,long); main(int argc, char *argv[]){ long a= 4454,b= 143052; printf("el m.c.d. de %ld y %ld es %ld\n",a,b,mcd(a,b));

Metodología y tecnología de la programación I 6/11 long mcd(long a, long b){ if (a==b) return a; else if (a<b) return mcd(a,b-a); else return mcd(a-b,b); 2.2 Recursión múltiple Alguna llamada recursiva puede generar más de una llamada a la función. Uno de los centros más típicos son los números de Fibonacci, números que reciben el nombre del matemático italiano que los descubrió. Estos números se calculan mediante la fórmula: Estos números poseen múltiples propiedades, algunas de las cuales todavía siguen descubriéndose hoy en día, entre las cuales están: La razón (el cociente) entre un término y el inmediatamente anterior varía continuamente, pero se estabiliza en un número irracional conocido como razón áurea o número áureo, que es la solución positiva de la ecuación x 2 -x-1=0, y se puede aproximar por 1,618033989. Cualquier número natural se puede escribir mediante la suma de un número limitado de términos de la sucesión de Fibonacci, cada uno de ellos distinto a los demás. Por ejemplo, 17=13+3+1, 65=55+8+2. Tan sólo un término de cada tres es par, uno de cada cuatro es múltiplo de 3, uno de cada cinco es múltiplo de 5, etc. Esto se puede generalizar, de forma que la sucesión de Fibonacci es periódica en las congruencias módulo m, para cualquier m. Si F(p) es un número primo, p también es primo, con una única excepción. F(4)=3; 3 es primo, pero 4 no lo es. La suma infinita de los términos de la sucesión F(n)/10 n es exactamente 10/89. Veamos un programa que nos permite calcular el número n de la serie de Fibonacci:

Metodología y tecnología de la programación I 7/11 /* *ejemplo7_3.c */ #include <stdio.h> long fibonacci (int); int main() { int n= 30; printf("el %dº número de Fibonacci es %ld\n", n, fibonacci(n)); long fibonacci(int n) { if (1 == n 2 == n) { return 1; else { return (fibonacci(n-1) + fibonacci(n-2)); 2.3 Recursión mutua Implica más de una función que se llaman mutuamente. Un ejemplo es el determinar si un número es par o impar mediante dos funciones: /* *ejemplo7_4.c */ #include <stdio.h> long fibonacci (int); int main(){ int n= 30; if (par(n)) printf("el número es par"); else printf("el número es impar"); int par(int n){ if (n==0) return 1; else return (impar(n-1)); int impar(int n){ if (n==0) return 0;

Metodología y tecnología de la programación I 8/11 else return(par(n-1)); Veamos un ejemplo de ejecución de este programa: par(5) -> return(impar(4)) impar(4) -> return(par(3)) par(3) -> return(impar(2)) impar(2) -> return(par(1)) par(1) -> return(impar(0)) return(0) (no es par) return(0) return(0) return(0) return(0) impar(0) -> return(0)

Metodología y tecnología de la programación I 9/11 3 Ejercicios 1. Construir una función recursiva que calcule la suma de los n primeros números naturales. 2. Construir una función recursiva que imprima la lista de números naturales comprendidos entre dos valores a y d dados por el usuario. 3. Escribir una función recursiva que devuelva la cantidad de dígitos de un número entero. 4. Escribir una función recursiva que calcule x^y mediante multiplicaciones sucesivas, siendo x e y dos números enteros. 5. Escribir una función recursiva que calcule x*y mediante sumas sucesivas, siendo x e y dos números enteros. 6. Calcula mediante un diseño recursivo el valor máximo de un vector de componentes numéricas. 7. Construir una función recursiva que cuente el número de secuencias de dos 1 seguidos que hay en una cadena de caracteres que represente un número binario. 8. Escribir la función recursiva que recibiendo como parámetros una cadena de dígitos hexadecimales y su longitud devuelva el valor decimal que representa dicha cadena. 9. Modificar el programa anterior para que la secuencia de 1 sea de longitud m. 10. Calcular C (n,k) siendo: C (n,0)= C (n,n)=1 C (n,k)= C (n-1,k) + C (n-1,k-1) si n>=0 si n>k>0

Metodología y tecnología de la programación I 10/11 4 Apéndice: las torres de Hanoi Las torres de Hanoi son un conocido juego de niños que se juega con tres pivotes y un cierto número de discos de diferentes tamaños. Los discos tienen un agujero en el centro y se pueden apilar en cualquiera de los pivotes. Inicialmente, los discos se amontonan en el pivote de la izquierda por tamaño decreciente como se muestra en la figura. El objeto del juego es llevar los discos del pivote más a la izquierda al de más a la derecha. No se puede colocar nunca un disco sobre otro más pequeño y sólo se puede mover un disco a la vez. Cada disco debe encontrarse siempre en uno de los pivotes. El problema de las torres de Hanoi puede resolverse fácilmente usando recursividad. La estrategia consiste en considerar uno de los pivotes como el origen y otro como destino. El problema de mover n discos al pivote derecho se puede formular recursivamente como sigue: 11. mover los n-1 discos superiores del pivote izquierdo al del centro empleando como sería el pivote de la derecha. 12. mover el n-ésimo disco (el más grande) al pivote de la derecha. 13. mover los n-1 discos del pivote del centro al de la derecha.

Metodología y tecnología de la programación I 11/11 Este problema tiene una complejidad computacional exponencial: el número mínimo de movimientos para mover n discos es 2 n -1. 4.1 Leyenda sobre las torres de Hanoi Cuenta la leyenda que Dios al crear el mundo, colocó tres varillas de diamante con 64 discos en la primera. También creó un monasterio con monjes, los cuales tienen la tarea de resolver esta Torre de Hanoi divina. El día que estos monjes consigan terminar el juego, el mundo acabará en un gran estruendo. El mínimo número de movimientos que se necesita para resolver este problema es de 2 64-1. Si los monjes hicieran un movimiento por segundo, las 64 torres estarían en la tercera varilla en poco menos de 585 mil millones de años. Como comparación para ver la magnitud de esta cifra, la Tierra tiene unos 5 mil millones de años, y el Universo entre 15 y 20 mil millones de años de antiguedad, solo una pequeña fracción de esa cifra. Ejercicio: Realice una implementación en C se permita resolver el problema de las torres de Hanoi.