Tema 06: Recursividad

Documentos relacionados
Guía práctica de estudio 03: Algoritmos

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

Guía práctica de estudio 03: Algoritmos

Funciones Tipos de funciones y Recursividad

Tema 14: Arreglos estáticos en C

Tema 2 Introducción a la Programación en C.

Tema 13: Apuntadores en C

Semana de las Matemáticas e Ingeniería. Desarrollo de algoritmos recursivos empleando la aplicación PseInt

Laboratorio 02: Ejercicios de programación en C

Programcaión Básica. Secuencias de Control y Repetición. Arturo Vega González.

Algoritmos y programas. Algoritmos y Estructuras de Datos I

Algoritmos. Medios de expresión de un algoritmo. Diagrama de flujo

Estructuras de control

Diseño Estructurado de Algoritmos

Funciones como Subprogramas en C++

Distinguir las diferentes estructuras de repetición utilizadas en problemas con bucles: mientras, repetir mientras, para.

Análisis de Algoritmos

Recursividad. Introducción a la programación

Métodos para escribir algoritmos: Diagramas de Flujo y pseudocódigo

Ciclos. Recordando Estructuras de Control Básicas: SELECCIÓN (condición) SECUENCIAL

SISTEMAS INFORMÁTICOS PROGRAMACION I - Contenidos Analíticos Ing. Alejandro Guzmán M. TEMA 2. Diseño de Algoritmos

Guía práctica de estudio 05: Diagramas de flujo

Agradecimientos. Nota de los autores. 1 Problemas, algoritmos y programas 1

Computadora y Sistema Operativo

GUIA 2: Repaso sobre uso de C#. Funciones, métodos y arreglos.

TEMA 4. ESTRUCTURAS DE CONTROL

MANUAL DE PRÁCTICAS DEL TALLER DE PROGRAMACIÒN PRACTICA NO.6

Análisis de algoritmos

PROGRAMACIÓN UNIDADES

Algoritmos glotones. mat-151

Profesor(a): M. A. Zeferino Galarza Hernández

la solución a una ecuación cuadrática solicitando al usuario los términos de dicha ecuación.

Estructuras de Control

Programación de Computadores 4 Iteraciones y Decisiones. Prof. Javier Cañas. Universidad Técnica Federico Santa María Departamento de Informática

Algoritmos. Diagramas de Flujo. Informática IV. L. S. C. Heriberto Sánchez Costeira

Introd. al Pens. Científico Nociones básicas de la lógica ClasesATodaHora.com.ar

PROGRAMACIÓN. UNIDAD II. ALGORITMO PROFA : HAU MOY

Taller de Resolución de Problemas Computacionales

Tema 6 Organización y gestión de la memoria

UNIDAD ACADÉMICA PROFESIONAL TIANGUISTENCO

2. Codificar de forma sistemática la secuencia de instrucciones en un lenguaje.

Diseño de compiladores. Organización de memoria. Organización de memoria. Organización de memoria. Zona de código 04/05/2014 ORGANIZACIÓN DE MEMORIA

Tema 3 SUBRUTINAS. Estructura de Computadores OCW_2015 Nekane Azkona Estefanía

Estudio de fallas asimétricas

CAPITULO ALGORITMOS Y PROGRAMAS CONTENIDO

Complejidad de los Algoritmos

INICIACIÓN A LA PROGRAMACIÓN 1ª parte

DEPARTAMENTO DE MATEMATICAS Y FISICA Matemáticas Discreta

Resolución de Problemas

Estructuras de Repetición (Hacer-Mientras)

Series aritméticas. ó La suma de los primeros n términos en una serie se representa por S n. . Por ejemplo: S 6

Algoritmos y solución de problemas. Fundamentos de Programación Otoño 2008 Mtro. Luis Eduardo Pérez Bernal

LENGUAJES DE PROGRAMACION I. Propósito del curso :

2007/ PROGRAMACIÓN. Tipo: TRO Curso: 1 Semestre: AB CREDITOS Totales TA TS AT AP PA OBJETIVOS. 1.-Introducción.

Tema 5.- Recursividad

Programación Dinámica 1

Programación MODULAR: Subalgoritmos - funciones y procedimientos

Métodos que devuelven valor Dado el siguiente triángulo rectángulo:

Materia: Matemática de 5to Tema: Método de Cramer. Marco Teórico

Metodología para la solución de problemas programables

Complejidad computacional (Análisis de Algoritmos)

C a l ses P P y y NP C a l se P C a l se N P N P [No N n o -De D te t rmin i i n s i ti t c i Polynomial-tim i e]

Estructuras de repetición

Departamento de Matemáticas. ÁLGEBRA: Ecuaciones

Manejo de módulos y recursión en programación. Pseudocódigo. (CU00204A)

Notación Asintótica 2

Fundamentos de Programación. Flujo de Control I: Estructuras selectivas

NOTACIÓN O GRANDE. El análisis de algoritmos estima el consumo de recursos de un algoritmo.

Tema 3: El Método Simplex. Algoritmo de las Dos Fases.

Tema 16: Tipos de datos estructurados en lenguaje C

Fundamentos de Ciencias de la Computación Trabajo Práctico N 2 Lenguajes Libres del Contexto y Sensibles al Contexto Segundo Cuatrimestre de 2002

UNIDAD 6.- PROGRAMACIÓN LINEAL

Herramientas computacionales para la matemática MATLAB: Cómo guardar el trabajo?

Departamento de Informática Universidad Técnica Federico Santa María. Tema 1: Algoritmos

1. Cuántas sentencias hay en la secuencia principal del siguiente programa?

Práctica IV: Métodos de Newton-Raphson y de la secante, para encontrar las raíces de una función.

Programación en C. Algoritmo y Estructura de Datos. Ing. M. Laura López. Programación en C

Unidad II: Análisis semántico

Práctica 3. Paso de parámetros entre subrutinas. 3. Consideraciones sobre el paso de parámetros

Fundamentos de programación

Nombre de la asignatura: Diseño Estructurado de Algoritmos. Carrera: Ingeniería en Sistemas Computacionales. Clave de la asignatura: SCB-9316

1. Computadores y programación

MODELOS DE COMPUTACION I Preguntas Tipo Test. 1. El lema de bombeo puede usarse para demostrar que un lenguaje determinado es regular.

Planificaciones Algoritmos y Programación I. Docente responsable: AZCURRA DIEGO ANDRES. 1 de 5

PROBLEMAS RESUELTOS SELECTIVIDAD ANDALUCÍA 2005 MATEMÁTICAS II TEMA 2: SISTEMAS DE ECUACIONES LINEALES

Algebra lineal y conjuntos convexos

Tema 3. El metodo del Simplex.

Tema II: Metodología para la construcción de programas

Visual Basic y.net: Procedimientos Sub y funciones Function. Parámetros. Organizar programas en módulos. (CU00338A)

Procesadores de lenguaje Tema 6 La tabla de símbolos

7.4. UTILIDADES DE LAS PILAS

Preparatoria Sor Juana Inés de la Cruz Cálculo Diferencial Tutorial: Optimización Ing. Jonathan Quiroga Tinoco

Estructura de datos. Carrera: SCC Participantes

Transcripción:

Tema 06: Recursividad M. en C. Edgardo Adrián Franco Martínez http://www.eafranco.com edfrancom@ipn.mx @edfrancom edgardoadrianfrancom (Prof. Edgardo A. Franco) 1

Contenido Recursión Recursividad Programación recursiva Tipos de recursión Ejemplo: Factorial Por qué escribir programas recursivos? Cómo escribir una función en forma recursiva? Qué pasa si se hace una llamada recursiva que no termina? Cuándo usar recursividad? Cuándo NO usar recursividad? Recursión vs. Iteración Prof. Edgardo Adrián0Franco Martínez 2

Recursión La recursión o recursividad es un concepto amplio, con muchas variantes, y difícil de precisar con pocas palabras. 3

4

La Matrushka es una artesanía tradicional rusa. Es una muñeca de madera que contiene otra muñeca más pequeña dentro de sí. Esta muñeca, también contiene otra muñeca dentro. Y así, una dentro de otra. 5

Recursividad La recursividad es un concepto fundamental en matemáticas y en computación. Es una alternativa diferente para implementar estructuras de repetición (iteración). Se puede usar en toda situación en la cual la solución pueda ser expresada como una secuencia de movimientos, pasos o transformaciones gobernadas por un conjunto de reglas no ambiguas. 6

La recursividad es un recurso muy poderoso que permite expresar soluciones simples y naturales a ciertos tipos de problemas. Es importante considerar que no todos los problemas son naturalmente recursivos. Un objeto recursivo es aquel que aparece en la definición de si mismo, así como el que se llama a sí mismo. 7

Programación recursiva Las funciones recursivas se componen de: Paso base: una solución simple para un caso particular (puede haber más de un paso base). La secuenciación, iteración condicional y selección son estructuras válidas de control que pueden ser consideradas como enunciados. Paso recursivo: una solución que involucra volver a utilizar la función original, con parámetros que se acercan más al paso base. Los pasos que sigue el paso recursivo son los siguientes: El procedimiento se llama a sí mismo. El problema se resuelve, resolviendo el mismo problema pero de tamaño menor. La manera en la cual el tamaño del problema disminuye asegura que el paso base eventualmente se alcanzará. 8

Asimismo, puede definirse un programa en términos recursivos, como una serie de pasos básicos, o pasos base (condición de parada), y uno más pasos recursivo, donde vuelve a llamarse al programa. En un programa recursivo, esta serie de casos recursivos debe ser finita, terminando con al menos un paso base. Es decir, a cada paso recursivo se reduce el número de pasos que hay que dar para terminar, llegando un momento en el que no se verifica la condición de paso a la recursividad. Ni el paso base ni el paso recursivo son necesariamente únicos. 9

Tipos de Recursión Por otra parte, la recursividad también puede ser indirecta, si tenemos un procedimiento P que llama a otro Q y éste a su vez llama a P o directa si P llama a P. Directa: el programa o subprograma se llama directamente a si mismo. int funcion (int numero) { if(numero==0) return 0; else funcion(numero-1); } return numero; 10

Indirecta: el subprograma llama a otro subprograma, y éste, en algún momento, llama nuevamente al primero. int funcion_uno (int numero) { for (i=0;i<numero;i++) printf("\nhola %d",numero); numero =funcion_dos(numero-1); //Función 2 return numero; } int funcion_dos if(numero==0) //Paso base return 0; else funcion_uno(numero-1); recursivo (Recursividad Indirecta) return numero; } //Paso 11

Recursividad (Ejemplo: Factorial) Escribe un programa que calcule el factorial (!) de un entero no negativo. : El factorial de n esta dado por: n! = n i=1 i n! = 1 x 2 x 3 x 4 x x n 1 x n 12

Definición recursiva del factorial: n! = 1 n 1! n 0! = 1 1! = 1 2! = 2 2! = 2 * 1! 3! = 6 3! = 3 * 2! 4! = 24 4! = 4 * 3! 5! = 120 5! = 5 * 4! si n = 0 sin n 1 13

14

15

Secuencia de factoriales. 0! = 1 1! = 1 2! = 2 3! = 6 4! = 24 5! = 120... N! = = 1 * 1 = 1 * 0! = 2 * 1 = 2 * 1! = 3 * 2 = 3 * 2! = 4 * 6 = 4 * 3! = 5 * 24 = 5 * 4! = N * (N 1)! 16

Secuencia que toma el factorial N! = 1 si N = 0 (base) N * (N 1)! si N > 0 (recursión) 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. 17

Recursividad (Ejemplo Factorial Solución ) Dado un entero no negativo x, regresar el factorial de x fact: //Entrada: n entero no negativo. //Salida: entero. int fact (int n) { if (n == 0) return 1; else return fact(n 1) * n ; } Es importante determinar un caso base, es decir un punto en el cual existe una condición por la cual no se requiera volver a llamar a la misma función. 18

Llamadas recursivas Resultados de las llamadas recursivas 19

Por qué escribir programas recursivos? Son mas cercanos a la descripción matemática. Generalmente mas fáciles de analizar Se adaptan mejor a las estructuras de datos recursivas (arboles, listas, etc.). Los algoritmos recursivos ofrecen soluciones estructuradas, modulares y elegantemente simples. 20

Cómo escribir una función en forma recursiva? <tipo_de_regreso><nom_fnc> (<param>) { [declaración de variables] [condición de salida] [instrucciones] [llamada a <nom_fnc> (<param>)] return <resultado> } 21

Qué pasa si se hace una llamada recursiva que no termina? Cada llamada recursiva almacena los parámetros que se pasaron al procedimiento, y otras variables necesarias para el correcto funcionamiento del programa. Por lo tanto si se produce una llamada recursiva infinita, esto es, que no termina nunca, llega un momento en que no quedará memoria para almacenar más datos, y en ese momento se abortará la ejecución del programa. Algunos S.O. modernos detectan la recursividad infinita de manera muy anticipada y evitan la ejecución de esta. Para probar esto se puede intentar hacer esta llamada en el programa factorial definido anteriormente: factorial(-1); 22

Ejercicio de clase Considere la siguiente ecuación recurrente: a n = a n-1 + 2 n a 0 = 1 Diseña un algoritmo computacional recursivo que de la solución. 23

Cuándo usar recursividad? Para empezar, algunos lenguajes de programación no admiten el uso de recursividad, como por ejemplo el ensamblador o el FORTRAN. Es obvio que en ese caso se requerirá una solución no recursiva (iterativa). Para simplificar el código. Cuando el problema tiene por definición una solución recursiva. Cuando es necesario navegar en una estructura de datos recursiva ejemplo: listas y árboles. 24

Cuándo NO usar recursividad? No se debe utilizar cuando la solución iterativa sea clara a simple vista. Sin embargo, en otros casos, obtener una solución iterativa es mucho más complicado que una solución recursiva, y es entonces cuando se puede plantear la duda de si merece la pena transformar la solución recursiva en otra iterativa. Cuando los métodos usen arreglos o estructuras de datos con un gran número de elementos (>miles). Cuando el método cambia de manera impredecible de campos. Cuando las iteraciones sean la mejor opción 25

Recursión vs. iteración Repetición Iteración: ciclo explícito Recursión: repetidas invocaciones a método Terminación Iteración: el ciclo termina o la condición del ciclo falla Recursión: se reconoce el paso base En ambos casos podemos tener ciclos infinitos Considerar que resulta más positivo para cada problema la elección entre eficiencia (iteración) o una buena ingeniería de software, La recursión resulta normalmente más natural. 26