Concepto de Recursión. Características de algoritmos recursivos. Ejemplos

Documentos relacionados
ARBOLES ARBOLES BINARIOS ORDENADOS. REPRESENTACIÓN Y OPERACIONES

Curso de Programación 1

ARBOLES ARBOLES BINARIOS ORDENADOS. REPRESENTACIÓN Y OPERACIONES

Tema 5.- Recursividad

program entrega1; const esp = ' '; {QUE FUNCION CUMPLE??} type longtext = string; texto = string[20]; {lista circular de jugadores}

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

Primer Parcial. Programación 1 Instituto de Computación Año 2011

FACULTADE DE INFORMÁTICA Departamento de Computación Estructura de Datos e da Información. Ejercicios de recursividad

Analisis de algoritmos

Tema 7: Recursividad

Tema 3. Análisis de costes

Resolución de Problemas

324 MR Versión 1 Primera Integral 1/5 Lapso 2009/2. ASIGNATURA: Computación II CÓDIGO: 324 MOMENTO: Primera Integral FECHA DE APLICACIÓN: 24/10/09;

Tema: Funciones, Procedimientos y Recursividad en C#.

Estructura de datos (arreglos) Vectores y Matrices

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

Estructura de Datos y de la Información. Pilas y expresiones aritméticas

<tipo> Tipo de dato de los elementos del vector

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

Funciones Tipos de funciones y Recursividad

7.1 Consideraciones. Considere la búsqueda de un libro en una biblioteca. Considere la búsqueda de un nombre en el directorio telefónico.

Resolución de Problemas y Algoritmos Clase 6: Repetición (continuación)

Alonso Ramírez Manzanares Computación y Algoritmos 10.03

Estructura de datos Tema 6: Tablas de dispersión (hashing)

Estrategias de Diseño de Algoritmos

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

Tablas de Dispersión (Hashing Tables)

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

Estructuras de Control

Algoritmos y Programación Clase 8

Módulo 8: Primitivas en Pascal

Manual de turbo pascal

Programación I. Ingeniería Técnica Informática. Ejercicios de los Temas 4, 5, 6 y 7

RECURSION. Se deben hacer cuatro preguntas para construir una solución recursiva:

Este es un arreglo de números enteros, o sea que guarda una serie de variables de tipo INTEGER, todas agrupadas en una sola estructura.

Estructura de datos Tema 2: Tipos Abstractos de Datos (TADs)

Declaración de Procedimientos

Tipos de datos. Lección 1. Programación. Curso J. A. Bañares, Pedro J. Álvarez, S. Velilla

5. Subprogramas Fundamentos de Informática

Parte 4: Estructuras de Control

Informática I. Software - Algoritmo. Alejandro Furfaro

UTN FRR Ingeniería en Sistemas de Información Algoritmos y Estructuras de Datos Archivos Directos GUIA DE ESTUDIO: ARCHIVOS DIRECTOS

Instituto de Computación - Facultad de Ingeniería - Universidad de la República

Algoritmo de Euclides

ALGORITMOS Y ESTRUCTURAS DE DATOS. Ejercicios Resueltos CUADERNILLO DE PRACTICA

Tema: FUNCIONES, PROCEDIMIENTOS Y RECURSIVIDAD.

Estructuras de control

Recursión. Capítulo 4

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

ESTRUCTURAS DE CONTROL

2.3 DEFINICIÓN DE LENGUAJES ALGORÍTMICOS

Unidad II: Análisis semántico

Funciones y paquetes PL/SQL. Jonathan Medina Gómez Facultad de ingeniería Universidad de Antioquia

Ejemplo de la implementación del llenado de un arreglo de forma aleatoria

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

Introducción a la Programación Ingenieria en Informática Junio 2008

Construyendo Programas más Complejos

Estructuras de repetición

Notación Asintótica 2

Control de Flujo. Estructuras de Control! Experiencia Educativa de Algorítmica CONTROL DE FLUJO

Ejercicios Tema 6. Funciones

Trabajo Práctico N 9 Recursividad

Escuela Politécnica Superior de Elche

6. Estructuras básicas de control 1. Pseudocódigo

6. Vectores Fundamentos de Informática

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

El lenguaje C. 3. Una instrucción que se ejecutará si la condición es verdadera.

Programación en Pascal

Arquitectura de Computadores II 8086 Parte II

ALGORITMOS Y ESTRUCTURAS DE DATOS

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

La segunda observación permite reformular el problema de una manera más simple:

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

EI MT1008 Programación II

Introducción a las sentencias de control

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

TP 3: intérprete de C en LISP (alias máquina virtual de C en LISP )

Enunciado de la tercera práctica de programación I

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

ÁRBOLES BINARIOS GRUPO # 22 Alumnos: Aguilar Elba Barrios Miguel Camacho Yaquelin Ponce Rodríguez Jhonny


FUNDAMENTOS DE INFORMÁTICA

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

Program Orden; Uses crt; Const n=100; Type vector= array[1..n] of integer; Var a,b : vector; prim, ulti,i, ne : integer; metodo : char;

FUNDAMENTOS DE PROGRAMACIÓN. 1º ING. INFORMÁTICA (Plan 2000) 2ª Convocatoria. 21 de junio de 2001

Algoritmos glotones. mat-151

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

La eficiencia de los programas

Algoritmos y estructuras de datos

Análisis y Diseño de Algoritmos Tablas de Hash

Ámbito Científico-Tecnológico Módulo IV Bloque 2 Unidad 1 Tan real como la vida misma

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

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

ANEXO XVII DE LA RESOLUCION N

Tipos algebraicos y abstractos. Algoritmos y Estructuras de Datos I. Tipos algebraicos

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

Curso Completo de Visual Basic 6.0

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

TEMA 5: Subprogramas, programación modular

FUNDAMENTOS DE PROGRAMACIÓN TALLER No. 1 Profesor: Alvaro Ospina Sanjuan

Transcripción:

RECURSION

Temario Concepto de Recursión Características de algoritmos recursivos Ejemplos

RECURSION Metodologías para resolver problemas: 1. Diseño Top Down 2. Recursión 3. Abstracción de Datos 4. Diseño orientado a objetos

RECURSION - CONCEPTO Una solución recursiva resuelve un problema por resolución de instancias más pequeñas del mismo problema. Suponga que quiere resolver cant=0 el problema de contar cuantas monedas hay en una pila de monedas while (hay monedas en la pila) do cuento una más (cant + 1) saco una moneda de la pila Cómo se piensa una solución recursiva?

RECURSION - CONCEPTO Toda solución recursiva tiene: un caso base o degenerado el problema es el mismo pero de menor tamaño contar monedas de la pila cant=0 Contar monedas de la pila si (hay monedas en la pila) cuento una más (cant + 1) saco una moneda de la pila contar monedas de la pila Caso base?

RECURSION - CONCEPTO Observaciones importantes: Se llama a sí mismo. En cada llamada el tamaño el problema se achica (la pila disminuye). Existe un caso distinto que se resuelve de manera particular y directa (sin recursión).

RECURSION - CONCEPTO Formalicemos un poco mas el algoritmo Procedure cuenta (var cant:integer); Begin if (la pila tiene monedas) then cant:= cant + 1; <sacar una moneda de la pila> cuenta (cant); End; Dónde se inicializa cant? Cómo se ejecuta un módulo recursivo?

RECURSION - CONCEPTO Pensemos en una pila que no sabemos cuantos elementos puede tener Qué estructura de datos la puede representar? Lista Type Pila =^listap; listap = record valor: integer; sig: ^listap; Cómo debemos construirla si debe funcionar como una pila? Él último elemento en apilar es el primero en salir

RECURSION - CONCEPTO Lista sa Type Pila = ^listap; listap = record valor: integer; sig: ^listap; Agrego por el frente, (puntero al primero) <Sacar un elemento de la pila> Saco por el frente el primer elemento Cómo es la implementación ió de sacar?

RECURSION - CONCEPTO Programa recursivo; Procedure cuenta (P:Pila; var cant:integer); Begin if (la pila P tiene monedas) then cant:= cant + 1; <sacar una moneda de la pila P> cuenta (P,cant); Var cantidad:integer; P:pila Begin cargarpila(p); cantidad:=0; cuenta (P, cantidad); End; Programa iteretivo; Procedure cuenta (P:Pila; var cant:integer); Begin while (la pila P tiene monedas) do cant:= cant + 1; <sacar una moneda de la pila P> Var cantidad:integer; P:pila Begin cargarpila(p); cantidad:=0; cuenta (P, cantidad); End;

RECURSION - CONCEPTO Programa recursivo; Procedure cuenta (P:Pila; var cant:integer); Begin if (la pila P tiene monedas) then cant:= cant + 1; <sacar una moneda de la pila P> cuenta (P, cant); Var cantidad:integer; P:pila Begin cargarpila(p); cantidad:=0; cuenta (P, cantidad); End; Programa iteretivo; Procedure cuenta (P:Pila; var cant:integer); Begin cant:=0; while (la pila P tiene monedas) do cant:= cant + 1; <sacar una moneda de la pila P> Var cantidad:integer; P:pila Begin cargarpila(p); cuenta (P, cantidad); End;

RECURSION - CONCEPTO Suponga que se quiere calcular el factorial de un númerosolución secuencial Solución recursiva function factorial (n:integer):integer; g Var i,fac:integer; Begin fac:=1; for i:= n downto 2 do fac:= fac*i; factorial:= fac; End; function factorial (n:integer):integer; Var i,fac:integer; Begin N! End; 1 si N<=1 N*(N-1)! si N>1 Caso base?

RECURSION - CONCEPTO Function factorial ( n: integer ) : integer; ; { Recibe un entero en n y devuelve un valor integer con su factorial} if ( n <=1 ) then factorial :=1 else factorial := n * factorial ( n - 1); Cómo es la ejecución de una solución recursiva?

RECURSION - EJECUCION Hay que comprender la manera en que se resuelven las llamadas a los módulos (sean éstos recursivos o no). Al ejecutarse un programa existe una zona de memoria denominada pila donde se almacena información por cada modulo activo, donde activo quiere decir que ha sido invocado y aún no ha retornado al programa principal. Esta información consiste en: Los parámetros de la función o procedure. Las variables locales del módulo La dirección de retorno es decir el punto del programa que debe pasar a La dirección de retorno, es decir el punto del programa que debe pasar a ejecutarse cuando el Módulo retorne.

RECURSION - EJECUCION Cuando un módulo es invocado toda esa información es apilada en la pila, al finalizar la ejecución del módulo esa información es retirada de la pila y en caso de una función sustituida por el valor de retorno, pasándose el control a la dirección indicada. Veamos la ejecución de la función factorial.

RECURSION - CONCEPTO Supongamos que esta función es llamada desde un programa principal con y := factorial(3) ; Sigamos la ejecución de la función: Function factorial ( n: integer ) : integer; ; if ( n <=1 ) then factorial :=1 La función devuelve 6 else factorial := n * factorial ( n - 1); n= 3 Factorial=3*factorial(2) 2 2 n= 2 Factorial=2*factorial(1) n= 1 Factorial=1 1 1

RECURSION - CONCEPTO Cada vez que se invoca el llamado recursivo vuelve a cargarse en memoria módulo recursivo a ejecutar. No es más eficiente i que una solución secuencial En muchos casos se obtienen soluciones mas fáciles de leer que las soluciones secuenciales Cómo se se calcula la potencia de un número de manera recursiva?

RECURSION - EJEMPLO Function Pot ( x:integer ; n:integer ) :integer; 1 si n=0 Pot x* pot(x,n-1) si n>0

RECURSION - EJEMPLO Function pot ( x, n: integer ): integer; if ( n =0 ) then pot:=1 else if ( n=1)thenpot ) :=x else pot := x * pot (x, n - 1); Hay más de un caso base QUE PASA CON EL PASAJE DE PARAMETROS?

RECURSION - Imprimen lo mismo? Para n = 4 como imprime? Procedure Imprimir (n : integer ) ; Procedure Imprimir (VAR n : integer ) ; if n<>0then n:= n - 1; if n < > 0 then Imprimir ( n ); n:= n - 1; write (n); Imprimir ( n ); write (n); 0 1 2 3 0 0 0 0

RECURSION - Ejemplo Cómo imprimimos los elementos de una lista de enteros? Program iterativo; Type lista = ^nodo; nodo = record dato:integer; sig:lista; Var l:lista; li Begin l:= nil; cargarlista(l); //Noseimplementa imprimir(l); End.

RECURSION - Ejemplo Procedure imprimir (Pri:lista); Begin while (pri<> nil) do write (pri^.dato); pri:= pri^.sig; End; Procedure imprimir (Pri:lista); Begin if (pri<> nil) then write (pri^.dato); pri:= pri^.sig; imprimir(pri); End;

RECURSION - Ejemplo Tomemos en cuenta el algoritmo de búsqueda binaria o dicotómica. Calcula el medio while (no se junten los punteros de inicio y de fin) if ( no es el elemento buscado) then tomo la mitad del arreglo que es adecuada Como lo pensamos recursivo?

RECURSION - Ejemplo n=20 pri = 1 ult= 8 medio= 4 5 17 22 45 108 158 196 223 Como 45 > 20, tengo que realizar la búsqueda en la primera mitad del vecto n=20 pri = 1 ult= 3 medio= 2 5 17 22 45 108 158 196 223

RECURSION - Ejemplo Como 17 < 20, tengo que realizar la búsqueda en la segunda mitad del vect n=20 pri = 3 ult= 3 medio= 3 5 17 22 45 108 158 196 223 Como 22 > 20, tengo que realizar la búsqueda en la primera mitad del vector. Al cruzarse los índices y no ser el número buscado devuelve false.

RECURSION - Ejemplo La conclusión es que siempre se hacen los mismos pasos: Calcular l primero, último y medio Comparar si es igual elemento del medio con el elemento buscado En caso de no ser el número buscado, actualizar índices Seguir buscando, pero en un vector más chico.

RECURSION procedure Binaria_Recursiva1 ( a:elemento; v : Vector; n : Indice; var inf:indice; var sup: Indice; var ok:boolean); var central:indice; central:= (inf + sup) div 2; if (a=v[central]) then ok:= TRUE else if (inf<=sup) then if (a<v[central])then sup:=central - 1 else inf:=central +1; binaria_recursiva1(a,v,n,inf,sup,ok) end else ok:= FALSE;

RECURSION - Ejercicio Implementar de manera recursiva una función que dada una lista de enteros retorne la suma de sus elementos

RECURSION - Conclusiones 1. Algunos problemas pueden resolverse con la misma simplicidad de manera recursiva que iterativa. 2. Las funciones y procedimientos no recursivos pueden ejecutarse más rápidamente y utilizar la memoria de manera más eficiente que los recursivos (se verá más adelante). 3. Usada de manera apropiada, la recursión es una herramienta muy poderosa para la resolución de problemas para los cuales no es sencillo encontrar una solución no recursiva. 4. La recursión también es apropiada cuando los datos involucrados en el problema están organizados en estructuras que pueden definirse recursivamente como listas, árboles, etc.