RECURRENCIA RECURSIÓN o RECURSIVIDAD

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

Alonso Ramírez Manzanares Computación y Algoritmos 10.03

Capítulo 2: Recursividad.

Bloque 4. La descomposición funcional y el diseño descendente

Tema: FUNCIONES, PROCEDIMIENTOS Y RECURSIVIDAD.

Metodología de la Programación II. Recursividad

Lenguaje C Funciones. Omar Andrés Zapata Mesa Grupo de Fenomenología de Interacciones Fundamentales, (Gfif) Universidad de Antioquia

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

Programación Orientada a Objetos Métodos Guía de Ejercicios v9.7

A = A n. = {a n. Georges E. Alfaro Salazar 1

Fundamentos de programación

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

El concepto de función en programación se fundamenta en el concepto de función matemática 1

1. Manejo de memoria estática 2. Manejo de memoria dinámica

Algoritmos glotones. mat-151

Para las ecuaciones diferenciales ordinarias no lineales no existen métodos generales.

CI 2125, Computación I

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

Presentación. Programación I. Conceptos Avanzados de Programación. :: Prof. Yeniffer Peña

2.2 Nombres, Ligado y Ámbito

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

Análisis de algoritmos

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

TEMA 4. ESTRUCTURAS DE CONTROL

8. Sentencia return y métodos

Problemas de Recursividad

3. Técnicas de diseño de algoritmos

Las plantillas permiten definir funciones genéricas.

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

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

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

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

Estructuras de Control

Introducción a la Computación (para Matemática) Primer Cuatrimestre de 2015

Contenidos. Gestión dinámica de memoria. Gestión dinámica de memoria. Introducción. 1. Introducción 2. El operador NEW 3. El operador DELETE

Gestión de la memoria en tiempo de ejecución

Funciones. Diseño de funciones. Uso de instrucción jal y retorno de subrutina.

Apuntadores en C y C++

El Lenguaje de Programación C (Pt. 1) Organización de Computadoras Depto. Cs. e Ing. de la Comp. Universidad Nacional del Sur

Tema 5.- Recursividad

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

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

Estructuras de control

Tema 2. El lenguaje JAVA

Titulo: Suma de N primeros números

Análisis de Algoritmos

Recursividad. J.M. Gimeno y J.L. González

int int. 1622

PROGRAMACIÓN UNIDADES

Tema 6. Reutilización de código. Programación Programación - Tema 6: Reutilización de código

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

Complejidad de Algoritmos

Programación 1. Tema II. Diseño de programas elementales. Lección 7. Diseño modular y descendente de programas

Construyendo Programas más Complejos

Examen Principios de Programación Febrero 2012

Algoritmos de Ordenamiento

Funciones como Subprogramas en C++

<tipo> Tipo de dato de los elementos del vector

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

TEORIA DE NUMEROS DIVISIBILIDAD Y NUMEROS PRIMOS. PRUEBAS DE PRIMALIDAD. LA CRIBA DE ERATOSTENES. ALGORITMOS. TEOREMA: EXISTENCIA DE INFINITOS PRIMOS.

Tema 4. Excepciones en Java

INTRODUCCIÓN. Estructura de Datos Tipos Abstractos de Datos (TAD S) Profs. Lorna Figueroa M. Mauricio Solar F. UTFSM 1 / 2008

Principios de Computadoras II

Curso de Programación en C. Licenciatura, FCQeI. APUNTADORES.

Punteros. Definición Un puntero es un dato que contiene una dirección de memoria.

Lenguajes de Programación. Juan Zamora O. Semestre II Nombres, Ambitos y Ligados

PROGRAMA DE ASIGNATURA DE PROGRAMACIÓN I

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

1. Sobrecarga de operadores. 2. Métodos operadores unarios Operador de incremento (prefijo)

Carlos A. Rivera-Morales. Precálculo 2

UNIDAD ACADÉMICA PROFESIONAL TIANGUISTENCO

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]

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

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

REFERENCIA DEL LENGUAJE

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

Contenido. Capítulo 1. Introducción a lenguaje C 1

PROBLEMAS DEL TEMA 7: Subprogramas y Modularidad

fib(0) + fib (1) + fib (5) = fib(5) = 3 + fib (3) + fib (4) = 3. + fib (1) + fib (2) + fib (4) =

La Plataforma J2SE (Java 7) PROGRAMA HOLA MUNDO

Programación. Test Autoevaluación Tema 3

La eficiencia de los programas

LENGUAJE. Tema 2 Elementos de un programa

Uso avanzado de punteros

Un módulo de programa tiene dos partes bien diferenciadas: la definición del módulo y la invocación o llamada al módulo.

Expresiones Aritméticas. Programación digital I Escuela de Sistemas Facultad de Ingeniería Gilberto Diaz

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

FUNDAMENTOS DE JAVA PARA LA CONCURRENCIA

Elementos de un programa en C

Algoritmos de Ordenación

1. Ejemplo de clase : La clase Cuenta 2. Uso de la clase Cuenta. 3. Métodos y objetos receptores de mensajes (Importante)

Sorting++ Herman Schinca. Clase de Junio de 2011

Tema: Clases y Objetos en C#. Parte II.

Procesadores de lenguaje Tema 6 La tabla de símbolos

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

TÉCNICO UNIVERSITARIO EN COMPUTACIÓN E INFORMÁTICA GUÍA DE ESTUDIO ANÁLISIS Y DISEÑO DE ALGORITMOS I CÓDIGO Elaborada por Kay Guillén Díaz

Tema 5 Sentencias de control de flujo. Fundamentos de Informática

TEMA 5. CONTROL DE FLUJO DEL PROGRAMA. Sentencia Instrucción Expresión Operadores + Operandos Sintaxis: Sentencia ;

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

Introducción a la Programación Orientada a Objetos PRACTICO N 6

Transcripción:

RECURRENCIA RECURSIÓN o RECURSIVIDAD 1

Definición Definición de diccionario Recursividad: Véase Recursividad 2

Definición Técnica que para resolver problemas basándose en la propia definición del mismo para su resolución. Se apoya en el concepto de Divide y vencerás, donde se pretende resolver un problema complejo a través de la resolución de subproblemas (relacionados con el original) más simples. 3

s Función factorial n! = 1 si n=0 n*(n 1)! si n>0 int factorial(int n) { if (n<0) return 1; if (n==0) return 1; else return n * factorial (n 1); } factorial (4) = 4 * = 4 * 3 * = 4 * 3 * 2 * factorial (1) = 4 * 3 * 2 * 1 * factorial(0) = 4 * 3 * 2 * 1 * 1 = 24 4

s - Iterativo Función factorial n! = 0 si n=0 n*(n 1)! si n>0 int factorial(int n) { int resultado = 1; int i; if (n<0) return 1; if (n==0) return 1; for (i=1; i<=n; i++) resultado *= i; } return resultado; - Legibilidad? - Eficiencia? 5

Stack frames Cada invocación de función requiere que se asigne un stack frame para almacenar variables automáticas, variables locales a la función, etc. Puede suceder que el stack se torne sobrecargado, dado que las diferentes invocaciones se van anidando, es decir, se van creando encima del stack del invocante Por supuesto esto no solo redunda en consumo de memoria sino también en consumo de tiempo durante la ejecución (run time). 6

Stack frames Cada invocación de función requiere que se asigne un stack frame para almacenar variables automáticas, variables locales a la función, etc. Puede suceder que el stack se torne sobrecargado, dado que las diferentes invocaciones se van anidando, es decir, se van creando encima del stack del invocante Por supuesto esto no solo redunda en consumo de memoria sino también en consumo de tiempo durante la ejecución (run time). 7

Stack frames Cada invocación de función requiere que se asigne un stack frame para almacenar variables automáticas, variables locales a la función, etc. Puede suceder que el stack se torne sobrecargado, dado que las diferentes invocaciones se van anidando, es decir, se van creando encima del stack del invocante Por supuesto esto no solo redunda en consumo de memoria sino también en consumo de tiempo durante la ejecución (run time). 8

Stack frames Cada invocación de función requiere que se asigne un stack frame para almacenar variables automáticas, variables locales a la función, etc. Puede suceder que el stack se torne sobrecargado, dado que las diferentes invocaciones se van anidando, es decir, se van creando encima del stack del invocante Por supuesto esto no solo redunda en consumo de memoria sino también en consumo de tiempo durante la ejecución (run time). 9

Stack frames Cada invocación de función requiere que se asigne un stack frame para almacenar variables automáticas, variables locales a la función, etc. Puede suceder que el stack se torne sobrecargado, dado que las diferentes invocaciones se van anidando, es decir, se van creando encima del stack del invocante Por supuesto esto no solo redunda en consumo de memoria sino también en consumo de tiempo durante la ejecución (run time). factorial(0) 10

Stack frames Cada invocación de función requiere que se asigne un stack frame para almacenar variables automáticas, variables locales a la función, etc. Puede suceder que el stack se torne sobrecargado, dado que las diferentes invocaciones se van anidando, es decir, se van creando encima del stack del invocante Por supuesto esto no solo redunda en consumo de memoria sino también en consumo de tiempo durante la ejecución (run time). factorial(0) factorial(0) (caso base) factorial(0) 11

Stack frames Cada invocación de función requiere que se asigne un stack frame para almacenar variables automáticas, variables locales a la función, etc. Puede suceder que el stack se torne sobrecargado, dado que las diferentes invocaciones se van anidando, es decir, se van creando encima del stack del invocante Por supuesto esto no solo redunda en consumo de memoria sino también en consumo de tiempo durante la ejecución (run time). factorial(0) factorial(0) (caso base) factorial(0) 12

Consideraciones Casos base, deben existir sino se alcanzará el límite de stack frame nesting Eficiencia/performance: invocar funciones tiene su costo en almacenamiento y tiempo Generalmente la recursión requiere un código más breve (minimalista) vs iteración y resulta más conveniente para analizar y mantener 13

Torres de Hanoi Video: Torres de Hanoi.flv Objetivo - Mover toda la torre desde la espiga A a la espiga C Reglas - Solo se puede mover un disco por vez - Nunca puede colocarse un disco de mayor diámetro encima de uno de menor diámetro 14

Torres de Hanoi Resolución (para 4 discos) PASO 1: Mover 3 discos de A a B usando C como espiga auxiliar PASO 2: Mover el último disco de A a C 15

Torres de Hanoi PASO 3: Mover los 3 discos de B a C usando A como espiga auxiliar Pasos Generales para resolución con N discos PASO 1: Mover (N-1) discos de A a B PASO 2: Mover disco N (el más grande) de A a C PASO 3: Mover (N-1) discos de B a C 16

Torres de Hanoi Pasos Generales para resolución con N discos PASO 1: Mover (N-1) discos de A a B PASO 2: Mover disco N (el más grande) de A a C PASO 3: Mover (N-1) discos de B a C Versión recursiva void hanoi (int n, char ori, char dest, char aux) { if (n == 1) { printf("mover disco de %c a %c.\n", ori, dest); } else { //Mover n 1 discos de ori a dest usando aux hanoi(n 1, ori, aux, dest); printf("mover disco de %c a %c.\n", ori, dest); //Mover n 1 discos de aux a dest usando ori hanoi(n 1, aux, dest, ori); } } int { hanoi(n, A, C, B); 17

Recursión de Cola (Tail recursion) Siguiendo la misma estrategia de reducción del problema a uno o más problemas simples pero evitando el frame stack nesting (anidamiento pila) se plantea el concepto de recursión de cola (tail recursion) Una función es recursiva de cola si no ejecuta ninguna instrucción luego de retornar, por tal motivo no hace falta mantener su frame, es más, no deberían crearse nuevos frames durante las invocaciones recursivas, sino reutilizarlo. La recursión de cola es generalmente tan eficiente como la iteración (depende del compilador). Compiladores que permiten optimizar código detectan funciones tail recursivas y las convierten en contrucciones iterativas. 18

Recursión de Cola (Tail recursion) Sumar dos números: a + b Versión recursiva sumar_rec(a, b) Si a==0 b Si a>=1 1 + sumar_rec(a-1, b) sumar_rec(3, 8) = 1 + sumar_rec(2, 8) pues a >= 1 = 1 + 1 + sumar_rec(1, 8) pues a >= 1 = 1 + 1 + 1 + sumar_rec(0, 8) pues a >= 1 = 1 + 1 + 1 + 8 = 11 pues a == 0 19

Recursión de Cola (Tail recursion) Sumar dos números: a + b Versión recursiva de cola sumar_tail_rec(a, b, c) con c inicialmente valiendo 0 Si a==0 b+c Si a>=1 sumar_tail_rec(a-1, b, c+1) sumar_tail_rec(3, 8, 0) = sumar_tail_rec(2, 8, 1) pues a >= 1 = sumar_tail_rec(1, 8, 2) pues a >= 1 = sumar_tail_rec(0, 8, 3) pues a >= 1 = 8 + 3 = 11 pues a == 0 Observar que no hay apilamiento de stack frames 20

Recursión de Cola (Tail recursion) Sumar dos números: a + b Versión recursiva de cola (más simple) sumar_tail_rec(a, b) Si a==0 b Si a>=1 sumar_tail_rec(a-1, b+1) sumar_tail_rec(3, 8) = sumar_tail_rec(2, 9) pues a >= 1 = sumar_tail_rec(1, 10) pues a >= 1 = sumar_tail_rec(0, 11) pues a >= 1 = 11 pues a == 0 21

Recursión de Cola (Tail recursion) Factorial Versión recursiva de cola factorial_tail_rec (n, acum) con acum inicializado en 1 Si n==0 acum Si n>0 factorial_tail_rec(n-1, acum*n) factorial_tail_rec(4, 1) = factorial_tail_rec(3, 1*4) pues n>0 = factorial_tail_rec(2, 4*3) pues n>0 = factorial_tail_rec(1, 12*2) pues n>0 = factorial_tail_rec(0, 1*24) pues n>0 = 24 pues n==0 22

Recursión de Cola (Tail recursion) Serie de Fibonacci: 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89,, n-2, n-1, n,... Versión recursiva fib_rec (n) Si n==1 o n==2 1 Si n > 2 fib_rec(n-1) + fib_rec(n-2) fib_rec(6) = fib_rec(5) + fib_rec(4) = fib_rec(4) + fib_rec(3) + fib_rec(3) + fib_rec(2) = fib_rec(3) + fib_rec(2) + fib_rec(2) + fib_rec(1) + fib_rec(2) + fib_rec(1) + 1 = fib_rec(2) + fib_rec(1) + 1 + 1 + 1 + 1 + 1 + 1 = fib_rec(2) + fib_rec(1) + 6 = 1 + 1 + 6 = 8 23

Recursión de Cola (Tail recursion) Versión recursiva de cola fib_tail_rec (n, a, b), inicializados a=0, b=1 Si n==1 b Si n > 1 fib_tail_rec(n-1, b, a+b) fib_tail_rec(6, 0, 1) = fib_tail_rec (5, 1, 0+1) pues n > 1 = fib_tail_rec (4, 1, 1+1) pues n > 1 = fib_tail_rec (3, 2, 2+1) pues n > 1 = fib_tail_rec (2, 3, 2+3) pues n > 1 = fib_tail_rec (1, 5, 3+5) pues n > 1 = 8 (valor de b) pues n == 1 24

Recursión de Cola (Tail recursion) Ejercicios - Función de Ackermann http://es.wikipedia.org/wiki/función_de_ackermann - Producto de dos enteros positivos prod_rec(a,b) & prod_tail_rec(a, b,?) - Potencia de dos enteros positivos pto_rec(a,b) & pot_tail_rec(a, b,?) 25