Programación de sistemas Recursión

Documentos relacionados
Análisis de algoritmos. Recursividad

Funciones: Pasos por Referencia Recursividad

Tema 7: Recursividad

Programación I 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 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

Tecnología de la Programación

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

Benemérita Universidad Autónoma del Estado de Puebla

ESTRUCTURAS REPETITIVAS

Tema 3. Estructuras de control y programación estructurada

Bloque II. Elementos del lenguaje de programación Java

Sentencias de Procesamiento Iterativo: while y do-while

RECURRENCIA RECURSIÓN o RECURSIVIDAD

RESUMEN DE CONCEPTOS BASICOS DE PROGRAMACION JAVA

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

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

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

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.

Java para programadores

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

Estructuras de Repetición (Repita para)

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

Estructuras de Repetición (Hacer-Mientras)

Fundamentos de programación

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

TEMA 4: Programación estructurada

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

Depto. Ingeniería de Sistemas Telemáticos Universidad Politécnica de Madrid ETSI Telecomunicación Fundamentos de Programación 15 de diciembre de 2011

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

7 INTRODUCCIÓN A LA RECURSIVIDAD.

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 (;)

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

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

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

Tema: Estructuras de Selección en C#.

6. Sentencias repetitivas o bucles

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

ESTRUCTURAS DE CONTROL Y DE SELECCIÓN

Pruebas de unidad con JUnit

Tema 3. Análisis de costes

Tema: Estructuras de Repetición en C# [For].

Examen Principios de Programación Febrero 2012

Programación Orientada a Objetos. Java: Excepciones

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

FUNDAMENTOS DE INFORMÁTICA

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

Estructuras de control

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.

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

Programación concurrente

Funciones Tipos de funciones y Recursividad

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

FACULTAD DE INGENIERÍA

Ejercicios Tema 6. Funciones

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

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

15. Parámetros o argumentos

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

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

Programación Orientada a Objetos. Java: Excepciones

Introducción a Python. Cecilia Manzino

Programación Dinámica

FUNDAMENTOS DE JAVA PARA LA CONCURRENCIA

Tema: Estructuras de Repetición en C# [While y Dowhile].

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

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

La Plataforma J2SE (Java 7) PROGRAMA HOLA MUNDO

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

Comencemos a programar con. Entrega 09

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

Transcripción:

Programación de sistemas Recursión Departamento de Ingeniería Telemática 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; 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; 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* public static long s (int n){ if (n==1){ return 1; return s(n+1)+n; *(si n > 1) Caso base Caso recursivo 6

Ejemplo 2 Recursión mal diseñada* s(3) = s(4)+3 = (s(5)+4)+3 = ((s(6)+5)+4)+3 = (((s(7)+6)+5)+4)+3 =... public static long s (int n){ if (n==1){ return 1; return s(n+1)+n; No termina El caso recursivo sucede infinitas veces El caso base no sucede nunca StackOverflowError (desbordamiento de la pila de memoria) *(si n > 1) 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; 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; 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; 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; return fac(n-1, n*m); public static void main (String[] args){ System.out.println(fac(4,1)); fac (4) = fac(4,1) = fac(3,4) = fac(2,12) = fac(1,24) = 24 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 Serie de Fibonacci (con n > 0) public static long fib(int n){ if (n<=1){ return 1; return fib(n-1)+fib(n-2); 16

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

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); 18

Recursión anidada: Morris public static int mor(int n, int m){ if (n==m){ return (m+1); 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 19

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

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

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. 22

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; 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 23

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. 24

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. 25