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

Documentos relacionados
Inicio del programa. Entrada de datos. Proceso de datos. Salida de datos. Fin del programa

Estrategias de Diseño de Algoritmos

Manual de turbo pascal

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

Módulo 8: Primitivas en Pascal

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

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

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

Tema 5.- Recursividad

Estructuras de Control. Secuencia y Selección

Estructura de datos (arreglos) Vectores y Matrices


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

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.

DEPARTAMENTO DE MATEMATICAS Y FISICA Matemáticas Discreta

Enteros. Son los números que no contienen componentes fraccionarios y, por tanto, no contienen punto decimal.

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

7. PROCEDIMIENTOS Y FUNCIONES

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

Curso de Programación 1

Complejidad de Algoritmos

Funciones Tipos de funciones y Recursividad

2.2 Nombres, Ligado y Ámbito

ESTRUCTURA DE DATOS: ARREGLOS

PROGRAMACIÓN CONCURRENTE. Tema 5 Monitores

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

Trabajo Práctico 8 División de Problemas en Subproblemas Uso de Procedimientos y Funciones

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

LABORATORIO DE PROGRAMACIÓN II Problemas HOJA 1 RECURSIVIDAD

Estructura de Datos: Archivos

Turbo Pascal 7, FPS y sus herramientas de análisis de errores.

FUNDAMENTOS DE INFORMÁTICA

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

Unidad, Librería, Unidad estándar, Interfaz, Implementación, Inicialización

Estructura de Datos: Archivos. Programacion I Mgter. Vallejos, Oscar A.

Programación en Pascal

5. Subprogramas Fundamentos de Informática

Tema 2. Recursividad. Fundamentos de Programación II. Luís Rodríguez Baena

UTN FRLP Ing. en Sistemas de Información Algoritmos y Estructura de Datos Trabajos Prácticos Curso 2010

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

SUBRANGO ENUMERADOS CONJUNTOS

Introducción a la calidad de código

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

Estudiemos el siguiente problema, propuesto por Wirth y desarrollado por Dijkstra: Una lista de las primeras secuencias que cumplen es:

Metodología de la Programación II. Recursividad

Carlos A. Rivera-Morales. Precálculo 2

Tema 3.- Predicados y sentencias condicionales

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

ALGORITMOS Y ESTRUCTURAS DE DATOS. Ejercicios Resueltos CUADERNILLO DE PRACTICA

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

ARBOLES ARBOLES BINARIOS ORDENADOS. REPRESENTACIÓN Y OPERACIONES

Alonso Ramírez Manzanares Computación y Algoritmos 10.03

PASCAL. Repaso de Pascal Introducción a Python. Pascal. Pascal - introducción. Pascal Declaraciones: Variables. Pascal Declaraciones: Tipos 07/04/2015

Estructuras de control

Programación MODULAR: Subalgoritmos - funciones y procedimientos

Tema: FUNCIONES, PROCEDIMIENTOS Y RECURSIVIDAD.

Programación Modular. Informática aplicada al medio ambiente curso 2010/2011

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

construcción de programas Prof. Eliana Guzmán U.

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

ARBOLES ARBOLES BINARIOS ORDENADOS. REPRESENTACIÓN Y OPERACIONES

Algoritmos glotones. mat-151

Definición de Tipo de Dato Abstracto (TDA)

Tema 4: Procedimientos y estructuras recursivas

EJERCICIOS EN PASCAL 1.- Área de un triángulo (Entrada y salida estándar - Pascal) 1.- Escribir un programa (en Pascal) que:

Resolución de Problemas

Programas ejemplo. Lenguaje de Programación PASCAL. Miguel Murguía

Recursión Directa. Una función es de recursión directa si contiene una llamada explícita a si misma. return foo (y 1); Recursión Indirecta

Arquitectura de Computadores II 8086 Parte II

8. Sentencia return y métodos

FUNDAMENTOS DE INFORMÁTICA

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.

1.4 Programación estructurada

Aprender a programar con Turbo Pascal. Turbo pascal

Unidad Didáctica 2. Elementos básicos del lenguaje Java Tipos, declaraciones, expresiones y asignaciones

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

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

ARCHIVOS de TEXTO en PASCAL

PROGRAMANDO EN PASCAL.

Conceptos de Algoritmos, Datos y Programas

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

Modelos de Desarrollo de Programas Y Programación Concurrente Clase N 3

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

Herramientas computacionales para la matemática MATLAB: Funciones definidas por el usuario (parte I)

Unidad II: Análisis semántico

2. ESTRUCTURA DE UN PROGRAMA EN TURBOPASCAL

3.2. Programación estructurada. Principal. Modulo 1 Modulo 2 Modulo 3 Modulo 4. Modulo Modulo Modulo 3 1 Modulo 4 1 Modulo 4 2. Pág.

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

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;

Problemas de Recursividad

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

Estructura general de un programa

Guía práctica de estudio 03: Algoritmos

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

ALGORITMOS Y ESTRUCTURAS DE DATOS

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

Análisis de Algoritmos

Estructuras dinámicas de datos

Mostrar Números Ascendentemente. Soluciones Ejercicios Tema 5. tostring Recursivo de LEG. Suma Recursiva de un Vector (1/3)

Programación Dinámica 1

Transcripción:

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

ÍNDICE Definición Conceptos básicos Ejemplos recursivos Recursión mútua Recursión e iteración

DEFINICIÓN Técnica de programación que describe los cálculos o las acciones de una manera autoalusiva. Se puede considerar como un caso particular de programación en el que se plantea la resolución en términos de subproblemas más sencillos. Por esta razón en Pascal se emplean subprogramas para su resolución (subprogramas autoalusivos)

EJEMPLO DE PROBLEMA RECURSIVO FACTORIAL DE UN NÚMERO ENTERO POSITIVO n! = n (n-1) (n-2)...1 (n-1)! = (n-1) (n-2)...1 de donde: Ley de recurrencia: n! = n (n-1)! si n>0 0! = 1 si n=0

Fac(4)=4*Fac(3) Fac(4)=4*(3*Fac(2)) Fac(4)=4*(3*(2*Fac(1))) Fac(4)=4*(3*(2*(1*Fac(0)))) Fac(4)=4*(3*(2*(1*1))) Fac(4)=4*(3*(2*1)) Fac(4)=4*(3*2) Fac(4)=4*6=24

IMPLEMENTACIÓN EN PASCAL MEDIANTE SUBPROGRAMAS FUNCTION Fac(numero:integer):integer; {Prec. numero 0} {Dev. Numero!} Begin if numero = 0 then else End; {Fac} Fac := 1 Fac := numero * Fac(numero-1) El identificador de una función puede aparecer dentro de su cuerpo para poder permitir la recursión Fac(numero-1) crea una replica del subprograma con el nuevo parámetro.

CONCEPTOS BÁSICOS Los subprogramas recursivos se caracterizan por que se invocan a sí mismos. Para poder definir recursivamente un problema es necesario que exista: Al menos un valor del parámetro sobre el que se hace la recursión que no provoca un nuevo cálculo recursivo: caso base. Un conjunto de casos llamados recurrentes que son los que si producen un nuevo cálculo recursivo.

PROCESO DE EJECUCIÓN. PILA RECURSIVA Ejecución del programa: Bajo una llamada recursiva el sistema reserva espacio (tabla de activación) donde almacenar una copia de los objetos locales y parámetros del subprograma en ese momento. La tabla de activación se amontona sobre las llamadas recursivas anteriores formando lo que se conoce como pila recursiva. Este proceso termina cuando un nuevo valor del parámetro no produce una nueva llamada recursiva (se alcanza el caso base). Una vez alcanzada esta situación el sistema va liberando el espacio reservado conforme los subprogramas se van ejecutando sobre su tabla de activación. Este proceso finaliza con la llamada inicial.

REPRESENTACIÓN GRÁFICA DEL PROCESO DE EJECUCIÓN DE UN PROGRAMA RECURSIVO BEGIN --------------- --------------- LLAMADA AL SUBPROGRAMA --------------- ---------------- END. BEGIN --------------- --------------- LLAMADA AL SUBPROGRAMA --------------- ---------------- END. T. Activación n T. Activación 3 T. Activación 2 T. Activación 1 T. Activación n T. Activación 3 T. Activación 2 T. Activación 1 BEGIN --------------- --------------- LLAMADA AL SUBPROGRAMA (Caso Base) ---------------- END.

PROCESO DE EJECUCIÓN DE UN SUBPROGRAMA RECURSIVO Fac(3)... If n=0 then Fac:=1 Else Fac=3*Fac(2) 6 Fac(2)... If n=0 then Fac:=1 Else Fac=2*Fac(1) 2 Fac(1)... If n=0 then Fac:=1 Else Fac=1*Fac(0) 1 Fac(0)... If n=0 then Fac:=1 Fac=1*Fac(0) Fac=2*Fac(1) Fac=3*Fac(2) Fac=1*Fac(0) Fac=2*Fac(1) Fac=3*Fac(2) 1

Fac(4)=4*Fac(3) Fac(4)=4*(3*Fac(2)) Fac(4)=4*(3*(2*Fac(1))) Fac(4)=4*(3*(2*(1*Fac(0)))) Fac(1)=4*Fac(0) Fac(2)=4*Fac(1) Fac(3)=4*Fac(2) Fac(4)=4*Fac(3) Para obtener la solución final se deshacen las llamadas anteriores siguiendo el orden inverso (pila recursiva). Fac(4)=4*(3*(2*(1*1))) Fac(4)=4*(3*(2*1)) Fac(4)=4*(3*2) Fac(4)=4*6=24 Fac(1)=4*Fac(0) Fac(2)=4*Fac(1) Fac(3)=4*Fac(2) Fac(4)=4*Fac(3)

EJEMPLOS RECURSIVOS La función de Fibonacci: f(n)= 1 si n=1,0 f(n)= f(n-1)+f(n-2) si n>1 Implementación en Pascal: FUNCTION fib(numero:integer):integer; {Prec. numero 0} {Dev. Fibonacci de un número} Begin if (numero=0) or (numero=1) then fib:=1 else fib:=fib(numero-1)+fib(numero-2) End; {fibonacci}

TABULACIÓN DE SUBPROGRAMAS RECURSIVOS En ocasiones una llamada recursiva genera por diferentes vías llamadas repetidas. Función de Fibonacci: Fib(4) 4 3 2 2 1 1 0 1 0 La solución consiste en dotar a la función de memoria para recordar los valores que ya ha calculado (tabla).

IMPLEMENTACIÓN DE LA TABLA PARA FIBONACCI type tdominio =0..20 tregistro= record definido: boolean; End; resultado: integer ttabla=array [tdominio] of tregistro; var tablafib:ttabla; i:tdominio; Function Fib(n: tdominio; var t:ttabla):integer; Begin if not t[n].definido then Begin t[n].definido:=true; t[n].resultado:=fib(n-1,t)+fib(n-2,t); End {if}; Fib:=t[n].resultado End; {Fibonacci} Begin tablafib[0].definido:=true; tablafib[0].resultado:=1; tablafib[1].definido:=true; tablafib[1].resultado:=1; for i:=2 to 20 do... tablafib[i].definido:=false;

OTROS EJEMPLOS RECURSIVOS El problema de las torres de Hanoi: Pasar discos de la torre A a la B, moviendo un único disco cada vez y apilando siempre un disco más pequeños sobre uno más grandes. A B C 1 2

A ini B fin C aux Pasar un disco de A a C ini-aux 2 1 2 1 Pasar un disco de A a B ini-fin 1 2 Pasar un disco de C a B aux-fin

El problema de las torres de Hanoi con tres discos: A ini B fin C aux 1 2 3 Argumentos del procedimiento: (n, ini, fin, aux)

A ini B fin C aux Pasar los dos discos superiores de A a C Ini-fin 2 3 1 Ini-aux 3 1 2 fin-aux 1 3 2 (n-1,ini, aux, fin)

Pasar el tercer disco de A a B A ini B fin C aux 1 3 2 Ini-fin

A ini B fin C aux Pasar los dos discos superiores de C a B aux-ini 1 3 2 aux-fin 1 2 3 1 2 3 ini-fin (n-1,aux, fin, ini)

PASAR TRES DISCOS DE A a B 1. Pasar dos discos de A a C: a. Mover 1 disco de A a B b. Mover 1 disco de A a C c. Mover 1 disco de B a C 2. Pasar un disco de a A a B 3. Pasar dos discos de C a B: a. Mover 1 disco de C a A b. Mover 1 disco de C a B c. Mover 1 disco de A a B

LEY DE RECURRENCIA: PASAR n DISCOS DE A a B 1. Pasar n-1 discos de A a C 2. Pasar un disco de a A a B 3. Pasar n-1 discos de C a B Siendo el caso base cuando n=0

IMPLEMENTACIÓN DEL PROBLEMA EN PASCAL PROCEDURE Pasardiscos(n:integer; ini,fin,aux:char); {Prec. n 0} {Efecto. Se pasan n discos de la torre inicial a la final} Begin if n>0 then begin Pasardiscos(n-1,ini,aux,fin); writeln( mover el disco, n:3, desde, ini, a, fin); Pasardiscos(n-1,aux,fin,ini) end {if} End; {Pasardiscos}

TRAZA DEL ALGORITMO PARA n=3 3 A B C 2 A C B Escribe 3 A-B 1 A B C 0 Escribe 1 A-B 0 Escribe 2 A-C 1 B C A 0 Escribe 1 B-C 2 C B A 1 C A B 0 Escribe 1 C-A Escribe 2 C-B 1 A B C 0 0 0 Escribe 1 A-B 0

PILA RECURSIVA PARA LA TRAZA ANTERIOR 1 A B C 2 A C B 3 A B C 1 A B C 2 A C B 3 A B C 2 A C B 3 A B C 1 B C A 3 A B C 1 B C A 3 A B C 3 A B C 1 C A B 2 C B A 1 C A B 2 C B A 2 C B A 1 A B C 1 A B C

RECURSIÓN MUTUA La recursión mutua se da cuando un programa llama a otro y éste a su vez es invocado por el primero. A esta recursión también se la denomina cruzada. Este problema para Pascal se resuelve mediante la palabra reservada forward. De esta forma el identificador del subprograma definido en segundo lugar esta predeclarado.

RECURSIÓN MUTUA: DECLARACIÓN PROCEDURE Segundo (parámetros); forward; PROCEDURE Primero (parámetros);... Begin {Primero}... Segundo(parámetros)... End; {Primero} PROCEDURE Segundo (parámetros);... Begin {Segundo}... Primero(parámetros)... End; {Segundo}

RECURSIÓN MUTUA: EJEMPLO Programa que determina la paridad de un entero positivo empleando para ello dos funciones recurrentes: Function Espar(n:integer):boolean; Function Esimpar(n:integer):boolean; que son mutuamente recurrentes entre sí.

Program Paridad; uses crt; Var n:integer; PROCEDURE Esimpar(n:integer); forward PROCEDURE Espar(n:integer); Begin if n=0 then writeln( el número es par ) else Esimpar(n-1) End;{Espar} PROCEDURE Esimpar(n:integer); Begin impar ) if n=0 then else End;{Esimpar} Begin {Paridad} clrscr; writeln( el numero es Espar(n-1) writeln( Introduce un número entero positivo ); readln(numero); espar(numero); readln {pausa} End; {Paridad}

RECURSIÓN vs ITERACIÓN Un programa que se invoca a sí mismo se repite un cierto número de veces. Por esta razón cualquier cálculo recursivo puede ser expresado como una iteración y viceversa. La elección entre uno y otro método vendrá dado por motivos de eficiencia y legibilidad. Un problema recursivo posee una solución más legible si se resuelve mediante un algoritmo recursivo. Una solución recursiva ocupa más memoria que una solución iterativa.