Tema 5.- Recursividad

Documentos relacionados
Tema 4.- Pilas y Colas

Programación. Tema 8: Tablas Hash. Apuntes elaborados por: Eduardo Quevedo, Aaron Asencio y Raquel López Revisado por: Javier Miranda el????

Apuntes elaborados por: Aaron Asencio, Eduardo Quevedo, Raquel López Revisado por: Javier Miranda el???

5. Subprogramas Fundamentos de Informática

Arquitectura de Computadores II 8086 Parte II

Alonso Ramírez Manzanares Computación y Algoritmos 10.03

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

Estructuras de Datos. La pila es un objeto dinámico en constante cambio.

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

3. Estructuras iterativas

Universidad de Valladolid. Departamento de informática. Campus de Segovia. Estructura de datos Tema 4: Ordenación. Prof. Montserrat Serrano Montero

Curso de Programación 1

Algorítmica y Complejidad. Tema 3 Ordenación.

7.4. UTILIDADES DE LAS PILAS

Tema 9. Algoritmos sobre listas. Programación Programación - Tema 9: Algoritmos sobre listas

Funciones Tipos de funciones y Recursividad

LA ESTRUCTURA DE DATOS PILA EN JAVA. CLASE STACK DEL API JAVA. EJEMPLO Y EJERCICIOS RESUELTOS. (CU00923C)

Listas, Pilas, Colas y Punteros. Semana 3

6. Vectores. 1. Introducción. 2. Declaración (I) Fundamentos de Informática Dpto. Lenguajes y Sistemas Informáticos.

TEMA 4. EXCEPCIONES Y MANEJO DE EXCEPCIONES.

<tipo> Tipo de dato de los elementos del vector

INDICE Parte 1. Visual Basic Capitulo 1. Qué es Visual Basic? Capitulo 22. Mi Primera Aplicación Capitulo 3. Elementos del lenguaje

Complejidad de Algoritmos

Recursividad. Introducción a la programación

Tema 3. Análisis de costes

Construyendo Programas más Complejos

Tema 6: Generación de código (parte 2)

LABORATORIO 3 ESTRUCTURAS REPETITIVAS WHILE / DO WHILE

Parte II: Estructuras de datos y algoritmos

Manual de turbo pascal

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

Tema 5. Estructura de datos Pila

Problemas de Recursividad

ELABORACIÓN DE ANTOLOGÍAS DIGITALES

Parte 4: Estructuras de Control

Programación Estructurada

Escuela Politécnica Superior de Ingeniería Departamento de Ingeniería Informática

Universidad Metropolitana Castro Carazo Prof. Ing. Patricia Vargas. Material de apoyo Semana #2 PROGRAMACIÓN II

Unidad II: Análisis semántico

Estructuras de Datos Dinámicas. Diseñar y programar en lenguaje C soluciones utilizando estructuras de datos dinámicas

Tecnólogo Informático- Estructuras de Datos y Algoritmos- 2009

Conceptos de Arquitectura de Computadoras Curso 2015

TEMA 8: Gestión dinámica de memoria

Procesos e Hilos en C

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

Analisis de algoritmos

Introducción a la Programación en MATLAB

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

funciones printf scanf

PROGRAMA DE ASIGNATURA DE PROGRAMACIÓN I

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

Índice general. Capítulo 1 Conceptos básicos. Capítulo 2 Controles básicos I. Pág. N. 1

Programación I: Funciones y módulos

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

Funciones como Subprogramas en C++

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

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

Algoritmos glotones. mat-151

Módulo 8: Primitivas en Pascal

ALGORITMOS Y ESTRUCTURAS DE DATOS. Ejercicios Resueltos CUADERNILLO DE PRACTICA

Comencemos a programar con. Entrega 09

Caracteres y Cadenas Conversión de Datos Funciones y procedimientos Archivos cabecera. Fundamentos de programación

Tema 13: Apuntadores en C

Tema ADQUISICIÓN Y TRATAMIENTO DE DATOS. Departamento de Ciencias de la Computación e IA. Subprogramas en C

Estructura de datos Tema 3: El TAD Lista lineal. Universidad de Valladolid. Departamento de informática. Campus de Segovia

Compiladores: Parsing ascendente

4.- Leer tres números y escribirlos en orden decreciente

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

6.1.- Introducción a las estructuras de datos Tipos de datos Arrays unidimensionales: los vectores Operaciones con vectores.

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

Conceptos a tratar. Fundamentos de la Programación Orientada a Objetos Ampliación sobre clases y objetos

Estructura de datos (arreglos) Vectores y Matrices

GUIA DE PROCEDIMIENTOS Y FUNCIONES ALMACENADOS EN MYSQL

Visual Basic: procedimientos Sub y funciones Function. Tipos de parámetros y tipos de retorno. Ejemplos (CU00340A)

Programación Avanzada para Sistemas de Telecomunicación Arrays

llamada a la función Val(num) cambiosigno(n) redondeo(num,3)

Complejidad computacional (Análisis de Algoritmos)

CAPÍTULO 1 INTRODUCCIÓN A LA PROGRAMACIÓN ORIENTADA A OBJETOS

TEMA 7: Ficheros. TEMA 7: Ficheros Concepto de fichero

Algoritmos Recursivos de Búsqueda y Ordenación y sus tiempos

Curso de Programación II con Visual Basic.Net

Escuela Politécnica Superior de Elche

Tema 6. Gestión dinámica de memoria

Estructuras de control

Estructuras de Datos en Java

Tema 2 Descripción de VHDL (2/2)

FUNDAMENTOS DE INFORMÁTICA

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

ARBOLES ARBOLES BINARIOS ORDENADOS. REPRESENTACIÓN Y OPERACIONES

Metodología de la Programación II. Recursividad

Inducción Matemática. Departamento de Matemáticas. Inducción Matemática p. 1/31

11. Algunas clases estándar de Java (II)

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

GENERALIDADES DEL LENGUAJE C

Algoritmos y Programación Clase 8

Transcripción:

Apuntes elaborados por: Raquel López, Eduardo Quevedo y Aaron Asencio Revado por: Javier Miranda el???? Tema 5.- Recursividad NOTA Todos los ejemplos que se exponen en este tema se pueden realizar utilizando la implementación del algoritmo Pila del tema anterior. Donde se encuentra la llamada a recursividad utilizamos el Push y en el return de la recursividad utilizaremos el Pop. La recursividad es posible gracias a la extencia de pilas. Las soluciones recursivas suelen ser bastante cortas pero cubren mucho más espacio en la memoria del ordenador, este es el principal inconveniente de las soluciones recursivas. Esto se debe a que si un programa recursivo tiene variables dentro del mmo programa éstas se crearán nuevas cada vez que se ejecute. Por este motivo en los procedimientos y funciones recursivos evitaremos pasar como parámetros arrays, matrices,, ya que estaremos haciendo un uso innecesario de la memoria. Si lo que queremos es una variable global entonces deberá estar en el programa principal. Por último aclarar la utilización de los parámetros de entrada (in) y de salida (out): IN Se comportan como constantes, no se pueden cambiar. Los valores introducidos en la pila no se modifican. OUT Son parámetros variables. Los valores se copian en la pila al elemento anterior. Los programas recursivos tendrán casi siempre la siguiente estructura: Avance Condición de parada Procesamiento Se vera más claro con un ejemplo: procedure Escribir ( N : in Natural) if N = 0 then Int_IO.Put (N); Escribir (N 1); Int_IO.Put (N); end Escribir; 1

En la pantalla veríamos 1 2 3 3 2 1 La Pila la crea el propio compilador en ella guarda todas las variables, parámetros y procedimientos, así como la dirección de retorno (línea donde se realizó la llamada anterior). Esta Pila se irá vaciando poco a poco se va deshaciendo el trabajo. Escribir 3 Escribir 2 Escribir 1 Algunos ejemplos de recursividad: Para escribir una palabra al revés utilizando recursividad tendremos en cuenta que si escribo a la ida escribiré la frase de forma correcta mientras que si escribo a la vuelta se escribirá la frase al revés. Frase : String (1.. 4) := Hola ; procedure Escribir (N : in Natural) if N > Frase Length then Escribir (N + 1); Put (Frase (N)); end Escribir; Escribir A En la pantalla veríamos Escribir L ALOH Escribir O Escribir H 2

Para calcular el factorial de cualquier número, es muy útil utilizar la recursividad, veamos como se haría: function Factorial (N : in Natural) return Natural if N=0 then return 1; else return N*Factorial (N-1); end Factorial; Factorial (0) 1 Factorial (1) 1*1=1 Factorial (2) 2*1=2 Factorial (3) 3*2=6 Factorial (4) 4*6=24 Factorial (5) Resultado 5*24=120 Casi todos las funciones y procedimientos iterativos pueden realizarse con funciones o procedimientos recursivos; como por ejemplo la búsqueda binaria. procedure Búsqueda_Binaria (Tabla : in T_Tabla; Valor : in Integer; Posicion : in out Integer ) Primero : Natural := Tabla First; Ultimo : Natural := Tabla Last; Mitad : Natural := (Primero + Ultimo)/ 2; if Tabla Lenght then rae No_Encontrado; 3

elsif Tabla (Medio) = Valor then Posición := Medio; elseif Valor < Tabla (Medio) then Búsqueda_Binaria (Tabla (Primer.. Medio - 1), Valor, Posicion) ; else Búsqueda_Binaria (Tabla (Medio + 1.. Ultimo), Valor, Posicion) ; end Búsqueda_Binaria; (20) First:2 Last:2 (10,20,) First:1 Last:2 (10,20,30,40) First:1 Last:5 A la ida de la recursividad pasaremos el valor que buscamos la posición del primero y la posición de medio-1. Cuando se encuentra el valor buscado ( vuelta de la recursividad) se va vaciando la pila con la posición en la que se encuentra el valor buscado. Hacer el ejercicio el problema iterativo Resultado := 0; for I in 1.. 100 loop Resultado := Resultado + I; end loop; de forma recursiva. procedure Programa Resultado := Integer := 0; 4

procedure Calcula (I : in Integer Resultado : in out Integer) -- Condiciòn de parada if I > 100 then Resultado := Resultado + 1; Calcula (I + 1, Resultado); end Calcula; Calcula (1, Resultado) end Programa; Procedimiento que de la vuelta a una lta. Lo haremos solo cambiando los punteros. procedure Invertir_Lta (Lta : in out T_Lta) procedure Invertir (Anterior, Actual : T_Nodo_Ptr) if Actual /= null then Lta.Primero := Anterior; Invertir (Actual, Actual.Siguiente); Actual.Siguiente := Anterior; end Invertir; if Lta.Primero = null then Invertir (null, Lta.Primero); end Invertir; 5