Programación de sistemas

Documentos relacionados
Análisis de algoritmos. Recursividad

Programación I Recursividad.

Tema 7: Recursividad

Funciones: Pasos por Referencia Recursividad

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

Tema: FUNCIONES, PROCEDIMIENTOS Y RECURSIVIDAD.

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

Tema: Funciones, Procedimientos y Recursividad en C#.

8. Sentencia return y métodos

Programación de sistemas

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

Introducción a Java. Introducción a Java. Programación I

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

Prueba N o 1. Programación II

Unidad Didáctica 3. Tipos genéricos. Fundamentos de Programación Departamento de Lenguajes y Sistemas Informáticos

Tecnología de la Programación

Benemérita Universidad Autónoma del Estado de Puebla

RECURRENCIA RECURSIÓN o RECURSIVIDAD

Bloque II. Elementos del lenguaje de programación Java

Sentencias de Procesamiento Iterativo: while y do-while

RESUMEN DE CONCEPTOS BASICOS DE PROGRAMACION JAVA

Tema 3. Estructuras de control y programación estructurada

Estructuras de control repetitivas/iterativas

a. Cuántas veces se ejecuta la instrucción System.out.println? b. Cuál es el diagrama de flujo correspondiente a este fragmento?

CONCEPTOS BASICOS DEL LENGUAJE JAVA

Instrucción de selección múltiple switch.

Ejercicios sobre recursividad

ESTRUCTURAS REPETITIVAS

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

Clase adicional 2. Estructuras básicas de control. Temas

PROGRAMACIÓN ORIENTADA A OBJETOS (L40629) Sabino Miranda-Jiménez

SESIÓN DE EJERCICIOS E1

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

Estructuración del programa en partes más pequeñas y sencillas

JavaScript Básico. Elementos Básicos: Comentarios: Literales: Valores que puede tomar una variable o una constante.

Tema 9. Recursividad

4. Operadores Operador asignación

Construcciones del Lenguaje Java

PROGRAMACIÓN ORIENTADA A OBJETOS (L40629) Sabino Miranda-Jiménez

Práctica #5: Uso de control de flujo, Excepciones y Lectura Estándar

Programa Java. El lenguaje de programación Java. Comentarios. Programa Java. Palabras reservadas. Identificadores

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

Universidad Nacional del Santa FACULTAD DE INGENIERIA E.A.P de Ingeniería de Sistemas e Informática NETBEANS 7.0

Fundamentos de programación

TEMA 4: Programación estructurada

Tema 2. El lenguaje de programación Java (Parte 1)

7 INTRODUCCIÓN A LA RECURSIVIDAD.

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

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

Java para programadores

Fundamentos PHP. El término puntuación nos referimos a la sintaxis usada en PHP para la terminación de una línea de código (;)

Estructura de Datos [Tipos de datos concretos y tipos de datos abstractos]

Pruebas de unidad con JUnit

6. Sentencias repetitivas o bucles

ESTRUCTURAS DE CONTROL Y DE SELECCIÓN

Examen Principios de Programación Febrero 2012

Tema 3. Análisis de costes

Programación Orientada a Objetos. Java: Excepciones

Estructuras de Repetición (Repita para)

Una Introducción a la Programación Estructurada en C

Metodología y Tecnología de la Programación

Estructuras de control

Estructuras de Repetición (Hacer-Mientras)

Funciones Tipos de funciones y Recursividad

Práctica 3 mtp. metodoloxía e tecnoloxía da programación. Presentar detalles básicos sobre la sintaxis del lenguaje de programación Java.

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

Para leer la entrada de consola, lo primero que se hace es construir un Scanner que este asociado al flujo de entrada estándar System.

Centro Asociado Palma de Mallorca. Antonio Rivero Cuesta

Ejercicios Tema 6. Funciones

PROGRAMACIÓN ORIENTADA A OBJETOS 10/02/2009. Examen de Java. Nombre: DNI: Titulación:

Programación Dinámica

Es ambigua, ya que la división y la multiplicación tienen el mismo grado de precedencia, qué parte de la expresión se realiza primero?

Esquemas repetitivos en Fortran 90. Esquemas repetitivos en Fortran 90. Esquemas repetitivos en Fortran 90. Tipos de Esquema

FACULTAD DE INGENIERÍA

Actividades de Divulgación del Centro Atómico Bariloche. Qué hay detrás de un programa de computadora? Daniela Arnica Pablo E. Argañaras.

Introducción a Python. Cecilia Manzino

Programación Orientada a Objetos. Java: Excepciones

Prácticas: Introducción a la programación en Java. Informática (1º Ingeniería Civil) Curso 2011/2012

15. Parámetros o argumentos

FUNDAMENTOS DE JAVA PARA LA CONCURRENCIA

Tema: Estructuras de Selección en C#.

Curso de Java Introducción a la Programación III

Universidad Autónoma de Tlaxcala. M.C. José Juan Hernández Mora. Primera Sesión

Programación en Lenguaje C

CURSO : ESTRUCTURA DE DATOS DOCENTE : ING. JUAN ZEVALLOS VALLE

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

Temario detallado. Conceptos generales de lenguajes y compiladores. Proceso de compilación de un programa en C++ bajo Code::Blocks

La Plataforma J2SE (Java 7) PROGRAMA HOLA MUNDO

Comencemos a programar con. Entrega 09

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

Elementos léxicos del lenguaje de programación Java

Taller de Programación I. Tema 02: Programación en Java, estructuras iterativas y condicionales

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

Herencia Java y Servicios Web I Master en Ingeniería Matemática

Programación concurrente

Transcripción:

Programación de sistemas Recursión Julio Villena Román <jvillena@it.uc3m.es> MATERIALES BASADOS EN EL TRABAJO DE DIFERENTES AUTORES: Carlos Delgado Kloos, Carlos Alario Hoyos 1

Contenidos Recursión Tipos de recursión Recursión vs. iteración 2

Recursión Proceso por el cual un método se llama a sí mismo de forma continuada hasta que se llegue a un determinado estado Caso recursivo: El método se invoca a sí mismo Caso base: Permite salir de la recursión Un método recursivo debe tener un caso recursivo y al menos un caso base El caso recursivo debe aproximarse al caso base Los métodos recursivos utilizan sentencias más sencillas para simplificar problemas complejos 3

Ejemplo 1 Sumatorio de 1 a n (con n > 0) public static long s (int n){ if (n==1){ return 1; else{ return s(n-1)+n; Caso base Caso recursivo 4

Ejemplo 1 Sumatorio de 1 a n (con n > 0) s(3) = s(2)+3 = (s(1)+2)+3 = (1+2)+3 = (3+3)= 6 public static long s (int n){ if (n==1){ return 1; else{ return s(n-1)+n; El caso recursivo sucede dos veces => s(3) y s(2) El caso base sucede una vez => s(1) 5

Ejemplo 2 Recursión mal diseñada* *(si n > 1) public static long s (int n){ if (n==1){ return 1; else { return s(n+1)+n; Caso base Caso recursivo 6

Ejemplo 2 Recursión mal diseñada* *(si n > 1) s(3) = s(4)+3 = (s(5)+4)+3 = ((s(6)+5)+4)+3 = (((s(7)+6)+5)+4)+3 =... (no termina!!) public static long s (int n){ if (n==1){ return 1; else { return s(n+1)+n; El caso recursivo sucede infinitas veces El caso base no sucede nunca StackOverflowError (desbordamiento de la pila de memoria) 7

Ejemplo 3 Sumatorio de n a 1000 public static long s (int n){ if (n==1000){ return 1000; else if (n>1000){ return 0; else{ return s(n+1)+n; Casos base Caso recursivo 8

Ejemplo 4 Cuenta atrás (con contador > 0) public static void cuentaatras(int contador){ if(contador == 0) { return; else { System.out.println(""+contador); cuentaatras(--contador); return; Caso base Caso recursivo 9

Ejercicio 1 Implementa el método recursivo square(int n), el cual permite calcular el cuadrado de n (cuando n > 1). Para ello puedes tener en cuenta la siguiente fórmula: (N-1) 2 = N 2-2N + 1 10

Ejercicio 2 Implementa el método recursivo riddle(int p, int q)con p y q > 0. Cada vez que se invoca este método, el valor de q incrementa en una unidad, mientras que el valor de p decrementa en una unidad. Al llegar p a cero, el método devuelve el valor de q. Cuántas veces se ejecuta el caso recursivo y el caso base al llamar a riddle(3,5) y cuál es el valor de retorno? 11

Tipos de recursión Recursión lineal o Máximo una llamada recursiva por caso recursivo o Recursión no por la cola (non-tail recursion) Hay que llegar al caso base para obtener el primer resultado. Entonces comienza el calculo del resultado final Computacionalmente costoso o Recursión por la cola (tail recursion) El resultado final se obtiene al llegar al caso base (uso de un acumulador) Menor coste computacional 12

Recursión lineal no por la cola Cálculo del factorial fac(n) = n! = n*(n-1)*(n-2) 2*1 (con n >= 0) public static long fac(int n){ if (n<=1){ return 1; else{ return n*fac(n-1); public static void main (String[] args){ System.out.println(fac(4)); fac (4) = 4*fac(3) = 4*3*fac(2) = 4*3*2*fac(1) = 4*3*(2*1) = 4*(3*2) = 4*6 = 24 13

Recursión lineal por la cola Cálculo del factorial fac(n) = n! = n*(n-1)*(n-2) 2*1 (con n >= 0) public static long fac(int n, int m){ if (n<=1){ return m; else{ return fac(n-1, n*m); fac (4) = fac(4,1) = fac(3,4) = fac(2,12) = fac(1,24) = 24 public static void main (String[] args){ System.out.println(fac(4,1)); 14

Tipos de recursión Recursión no lineal o Varias llamadas recursivas por caso recursivo o Recursión en cascada P.ej. return método(n) + método(n-1); o Recursión anidada P.ej. return método(n, método(n-1)); 15

Recursión en cascada: Fibonacci fib(5)= fib(4)+fib(3)= 5+3 n fib(n) 0 1 1 1 2 2 3 3 4 5 5 8...... 16

Recursión en cascada: Fibonacci Serie de Fibonacci (con n > 0) public static long fib(int n){ if (n<=1){ return 1; else{ return fib(n-1)+fib(n-2); 17

Recursión en cascada: Fibonacci Conversión a recursión lineal de Fibonacci 18

Recursión en cascada: Fibonacci Conversión a recursión lineal de Fibonacci public static long fibo(int n, int x, int y){ if (n<=1){ return x+y; else { return fibo(n-1, y, x+y); public static long fib (int n){ return fibo(n,0,1); 19

Fibonacci no recursivo (1+ 5) n+1 - (1-5) n+1 fib(n)= (2 n+1 5) 20

Recursión anidada: Morris public static int mor(int n, int m){ if (n==m){ return (m+1); else{ return(mor(n, mor(n-1, m+1))); mor(4,0) = mor(4, mor(3,1)) = mor(4, mor(3, mor(2,2)) = mor(4, mor(3,3)) = mor(4,4) = 5 21

Ejercicio 3 Implementa el método recursivo a(int m, int n)que permite calcular la función de Ackermann-Peter tal y como se define a continuación: 22

Tipos de recursión Recursión mutua public static boolean par(int n){ if (n==0){ return true; else{ return impar(n-1); public static boolean impar(int n){ if (n==0){ return false; else{ return par(n-1); 23

Recursión vs. Iteración La recursión lineal por la cola se puede convertir de forma inmediata en iteración (bucle). Para otras formas de recursión se requieren técnicas de transformación de programas y posiblemente estructuras de datos más complejas. The transformation from recursion to iteration is one of the most fundamental concepts of computer science. D. Knuth, 1974 24

Recursión vs. Iteración Cálculo del factorial fac(n) = n! = n*(n-1)*(n-2) 2*1 (con n > 0 y m = 1) public static long fac(int n, int m){ if (n<=1){ return m; else{ return fac(n-1, n*m); Recursión public static long fac(int n, int m){ private int a = n; private int b = m; while (! a <= 1){ b = a * b; a = a 1; return b; Iteración 25

Ejercicio 4 Implementa el método recursivo mcd(int a, int b) el cual permite calcular el máximo común divisor de dos números enteros. 26

Ejercicio 5 Implementa el método recursivo dectobin(int decimal, String binary) el cual recibe un número decimal y devuelve una cadena con el equivalente en binario de dicho número decimal. 27