Técnicas de prueba y corrección de algoritmos

Documentos relacionados
Análisis y Diseño de Algoritmos (AyDA) Isabel Besembel Carrera

Técnicas de prueba y corrección de algoritmos

Divide-y-vencerás, backtracking y programación dinámica

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

Análisis y Diseño de Algoritmos (AyDA) Isabel Besembel Carrera

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

Ejercicios sobre recursividad

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

Análisis Amortizado. Diseño y Análisis de Algoritmos Cátedra de Programación Carrera de Ingeniería de Sistemas Prof. Isabel Besembel Carrera

Complejidad de algoritmos recursivos

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

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

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

Tema 7: Recursividad

Análisis y Diseño de Algoritmos (AyDA) Isabel Besembel Carrera

Recursividad Definición

ESTRUCTURA DE DATOS: Tema 3. Recursividad

Tema 06: Recursividad

Metodología de la Programación II. Recursividad

Secuencias Calculadas

Hasta ahora sólo hemos visto algoritmos con tratamiento secuencial

Análisis de algoritmos. Recursividad

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

Estructura de Datos. Recursividad. Primer Semestre, Indice

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

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

Tema 9. Recursividad

Lenguajes y Compiladores Análisis Sintáctico Parte I. Teoría Lenguajes 1

M.C. Yolanada Moyao Martínez

Algoritmos y programas. Algoritmos y Estructuras de Datos I

Tema 4.- Recursión e iteración

Programación Unidad 5. Recursividad. Programación TIG - TUP 1. Sede Regional Orán UNIVERSIDAD NACIONAL DE SALTA

INDICE 1.1. Información y Significado 1.2. Arreglos en C 1.3. Estructura en C 1.4. Clases en C++ 2. La Pila 2.1. Definición y Ejemplos

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

Unidad II: Análisis semántico

ESTRUCTURA DE DATOS: Tema 3. Recursividad

TEMA 1. Recursividad. Recursividad CONTENIDO DEL TEMA

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

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

Inducción, Recursión y Alcance. Inducción, Recursión y alcance. Inducción, Recursión y Alcance. Inducción, Recursión y Alcance

Estructuras lineales de datos

Francisco J. Hernández López

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

Recursión. Capítulo 4

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

Fundamentos de la programación

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

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

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

Universidad Salesiana de Bolivia

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

Qué es la recursividad?

Análisis matemático de algoritmos recursivos

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

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

Búsqueda en espacio de estados

Primer Cuatrimestre 2018 Resolución de Problemas y Algoritmos

Splines (funciones polinomiales por trozos)

1. Una pila funciona según el método LIFO (Last In First Out ). Se define la clase Pila de la siguiente forma:

Tareas de la minería de datos: clasificación. CI-2352 Intr. a la minería de datos Prof. Braulio José Solano Rojas ECCI, UCR

Algoritmos y Programación Orientada a Objetos I. Contenedoras de tamaño variable y uso de ciclos en otros contextos

Tema 3. Análisis de costes

ARBOLES BINARIOS ORDENADOS. REPRESENTACIÓN Y OPERACIONES

Programación I Recursividad.

Examen No. 3 Valor: 50 Puntos (25% de la Nota Final) Tiempo Máximo 2 Horas Fecha: 9 de Diciembre del 2016

Estructura de Datos. Temario Unidad VI. Árboles Árboles Binarios

Pilas Motivación

ALGORÍTMICA. Dpto. Ingeniería de Sistemas y Automática Facultad de Ciencias Universidad de Valladolid.

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

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

n! = 1 2 n 0! = 1 (n+1)! = (n + 1) n!

Metodología y Tecnología de la Programación. I.T. Informática de Gestión

Propiedades de lenguajes independientes del contexto

Algorítmica y Lenguajes de Programación. Eficiencia y notación asintótica (ii)

Práctica 5.- Recursividad

Modularización en lenguaje C. Funciones

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

Búsqueda en espacio de estados

Algoritmos Secuenciales y Recursivos

Tema 2. Diseño del repertorio de instrucciones

Tecnología de la Programación

OCW-V.Muto Sistemas de numeración Cap. III CAPITULO III. SISTEMAS DE NUMERACION 1. REPRESENTACION DE LA INFORMACION

Análisis de algoritmos

RECURRENCIA RECURSIÓN o RECURSIVIDAD

Árboles generales. Un árbol es una estructura no lineal acíclica utilizada para organizar información de forma eficiente. La definición es recursiva:

Recursividad. Facultad de Ciencias de la Computación. Juan Carlos Conde R. Object-Oriented Programming I

Prof. María Alejandra Quintero. Informática Año

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

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

ESTRUCTURA DE DATOS Y ALGORITMOS Titulación: Ingeniero Técnico en Informática de Gestión Curso: 2º Nombre y apellidos: Nota:

Tarea 3 Búsqueda por Interpolación y Extrapolación

Subrutinas. Subrutinas. Erwin Meza Vega

Estructuras de Datos. 14 de junio de Apellidos

Tema 3. Recursividad.

Índice general 7. Presentación 15

Grafos: ordenamiento topológico, conectividad y árboles de expansión mínima

Transcripción:

Técnicas de prueba y corrección de algoritmos Diseño y Análisis de Algoritmos Cátedra de Programación Carrera de Ingeniería de Sistemas Prof. Isabel Besembel Carrera

Algoritmos recursivos Aparente circularidad del método: para resolver un problema, primero resuelva el problema!!!! Correcta interpretación del método: una instancia se resuelve mediante la solución de una o más instancias diferentes y más pequeñas Es un algoritmo recursivo si su ejecución provoca una o varias llamadas a él mismo. Recursividad simple: donde todas las llamadas recursivas se realizan dentro del mismo algoritmo Marzo, 2005 Prof. Isabel Besembel. Cátedra de Programación. Diseño y Análisis de Algoritmos. 2

Algoritmos recursivos Recursividad cruzada: cuando las llamadas recursivas se realizan del algoritmo recursivo R al algoritmo recursivo V y viceversa Para probar que un algoritmo recursivo da la solución correcta a alguna instancia, se asume que da una solución correcta a las instancias más pequeñas y esto sugiere inmediatamente, que se debe usar inducción sobre el tamaño de las instancias para probar que el algoritmo es correcto. Marzo, 2005 Prof. Isabel Besembel. Cátedra de Programación. Diseño y Análisis de Algoritmos. 3

Algoritmos recursivos Ejemplo : calcular el factorial de un número n si n = 0 n! = n* n si n > 0 Marzo/05 2 2 factorial(entero: n):entero {pre: n 0 } { pos: x = n! } x = Si ( n = 0 ) entonces x: Entero. Valor del factorial de n sino n * factorial(n-) fsi regrese f n = 0 => x = n = 3 => x = 6 Marzo, 2005 Prof. Isabel Besembel. Cátedra de Programación. Diseño y Análisis de Algoritmos. 4

Algoritmos recursivos Prueba de corrección del ejemplo Teorema: Para todo entero n 0, factorial(n) regresa n! Prueba: por inducción sobre n Etapa base: n = 0. La condición n = 0 es cierta y el algoritmo regresa. Es correcto ya que 0! = Etapa inductiva: Hipótesis inductiva: factorial(j) regresa j!, para todo j en el rango 0 j n-. Marzo, 2005 Prof. Isabel Besembel. Cátedra de Programación. Diseño y Análisis de Algoritmos. 5

Algoritmos recursivos Se debe demostrar que factorial(n) regresa n! Si n > 0, la prueba de la condición n = 0 falla y x = n * factorial(n-). Por la hipótesis inductiva, factorial(n-) regresa (n-)!, por lo cual factorial(n) regresa n x (n-)!, lo que es igual a n! La prueba es posible solamente porque la llamada recursiva se hace sobre una instancia más pequeña, y por ello la hipótesis inductiva puede aplicarse Marzo, 2005 Prof. Isabel Besembel. Cátedra de Programación. Diseño y Análisis de Algoritmos. 6

Algoritmos recursivos Ejemplo 2: Búsqueda binaria. Determinar si un valor x está en el vector ordenado A[a..b] Marzo/05 busquedabinaria(arreglo[a..b]detipoele: A, Entero: a, b, TipoEle: x):lógico { pre: a < b + A a A b } { pos: enc (a m b x = A m )} Si ( a > b ) entonces regrese falso sino m = ( a + b )/2 Si (x = A m ) entonces regrese verdadero sino si (x < A m ) entonces regrese busquedabinaria(a, a, m-, x) sino regrese busquedabinaria(a, m +, b, x) a, b: Entero. Valores inicial y final de los subíndices del vector A. m: Entero. Subíndices. 2 3 fsi fsi A(), a = 0, b = -, x = a => enc = falso A(2, 3, 4), a =, b = 3, x = 3 => enc = verdadero A(6), a =, b =, x = 4 => enc = falso Marzo, 2005 Prof. Isabel Besembel. Cátedra de Programación. Diseño y Análisis de Algoritmos. 7

Algoritmos recursivos Prueba de corrección del ejemplo 2 Teorema: Para todo n 0, donde n = b a + es el número total de elementos en el vector A[a..b], busquedabinaria(a, a, b, x) regresa correctamente el valor de la condición x A[a..b] Prueba: por inducción sobre n (el tamaño del arreglo) Etapa base: n = 0. El vector está vacío, a = b+, la prueba a>b es exitosa y el algoritmo regresa falso. Es correcto, ya que x no puede estar en el vector vacío Marzo, 2005 Prof. Isabel Besembel. Cátedra de Programación. Diseño y Análisis de Algoritmos. 8

Algoritmos recursivos Etapa inductiva: n>0. Hipótesis inductiva: j, 0 j n-, donde j=b -a +, busquedabinaria(a, a, b, x) regresa correctamente la condición x A[a..b]. Por la asignación m=(a+b)/2 se concluye que a m b. Si x=a[m], claramente x A[a..b] y el algoritmo regresa el valor correcto verdadero. Si x<a[m], como A está ordenado se concluye que x A[a..b] si y solo sí x A[a..m-]. Por la hipótesis inductiva esta segunda condición la regresa busquedabinaria(a, a, m-, x). Se aplica la hipótesis inductiva ya que 0 (m-)-a+ n-. El caso x>a[m] es similar y se concluye que el algoritmo calcula correctamente todas las instancias de tamaño n Marzo, 2005 Prof. Isabel Besembel. Cátedra de Programación. Diseño y Análisis de Algoritmos. 9

Árboles de ejecución Algoritmos recursivos Raíz: algoritmo recursivo etiquetado con la instancia inicial del problema Nodos: etiquetados con las instancias de las llamadas realizadas Marzo/05 2 2 3 mult(entero+: x, y):entero { pre: x, y 0 } { pos: r = xy 0} r = Si ( y = 0 ) entonces 0 sino si (y es par) entonces mult(2x, y/2) sino mult(2x, y/2) r + x fsi regrese r x = 0, y = 4 => r = 0 x = 3, y = 0 => r = 0 x = 4, y = 6 => r = 24 r: Entero+. Resultado de la multiplicación de x por y. Marzo, 2005 Prof. Isabel Besembel. Cátedra de Programación. Diseño y Análisis de Algoritmos. 0

Árboles de ejecución de algoritmos recursivos mult(4, 6) mult(8, 3) mult(0, 4) mult(0, 2) mult(6, ) r + x = 6 + 8 = 24 mult(0, ) mult(32, 0) r + x = 0 + 6 = 6 mult(0, 0) r + x = 0 + 0 = 0 r = 0 Marzo, 2005 Prof. Isabel Besembel. Cátedra de Programación. Diseño y Análisis de Algoritmos.

Eliminación de la recursión Todo algoritmo recursivo puede ser transformado en un algoritmo iterativo Los algoritmos recursivos se utilizan cuando los problemas admiten una descomposición recurrente natural, ya que el algoritmo calca dicha descomposición, siendo más clara y fácil la prueba de corrección Inconvenientes de los algoritmos recursivos: Ciertos lenguajes de programación no soportan la recursividad (Ejm: el lenguaje de máquina) Son más costosos en tiempo de ejecución y en espacio de memoria Marzo, 2005 Prof. Isabel Besembel. Cátedra de Programación. Diseño y Análisis de Algoritmos. 2

Eliminación de la recursión Se realiza en dos etapas: Eliminación de los parámetros y variables locales Transformación Etapa : sustituir cada ocurrencia de un parámetro formal variable por el parámetro actual correspondiente a la llamada Eliminación de los parámetros por valor Usando una pila para preservar sus valores Convirtiéndolos en variables globales Mismas etapas de un compilador para traducir el programa fuente a lenguaje de máquina Marzo, 2005 Prof. Isabel Besembel. Cátedra de Programación. Diseño y Análisis de Algoritmos. 3

Eliminación de la recursión Eliminación de las variables locales El compilador usa una pila para guardar los valores de cada parámetro por valor y cada variable local Etapa 2: Una sola llamada recursiva: colocar un lazo con un contador o con el control de la pila Varias llamadas recursivas: cada llamada se reemplaza por una bifurcación al inicio del algoritmo Marzo, 2005 Prof. Isabel Besembel. Cátedra de Programación. Diseño y Análisis de Algoritmos. 4

Ejemplo Marzo/05 hanoi(entero: n, TipoEle: a, b, c) {pre: n 0} { pos: n 0} Si ( n = ) entonces mover(a,b) sino hanoi(a, c, b, n-) mover(a,b) hanoi(c, b, a, n-) fsi mover(). Mueve un aro de a hacia b Marzo, 2005 Prof. Isabel Besembel. Cátedra de Programación. Diseño y Análisis de Algoritmos. 5

Ejemplo Marzo/05 2 3 4 hanoiite(entero: n, TipoEle: a, b, c) {pre: n 0} { pos: n 0} ( n ) [ aux, b, c, n = b, c, aux, n- p.empilar() ] mover(a, b) ( p.vaciapila() p.conpila() = 2 ) [ p.desempilar() aux, a, c, n = a, c, aux, n+ ] Si ( p.vaciapila() ) entonces p.desempilar() aux, b, c = b, c, aux mover(a,b) aux, a, c = a, c, aux p.empilar(2) ir a fsi mover(). Mueve un aro de a hacia b aux: TipoEle. Variable auxiliar para efectuar el intercambio p: Pila. Pila auxiliar para la eliminación de la recursión empilar(), vaciapila(), conpila(), desempilar(). Operaciones definidas para la clase Pila. Ejercicio: Eliminar el ir a del algoritmo anterior Marzo, 2005 Prof. Isabel Besembel. Cátedra de Programación. Diseño y Análisis de Algoritmos. 6