Programación II Recursividad

Slides:



Advertisements
Presentaciones similares
Capítulo 2 Algoritmos.
Advertisements

ESTRUCTURAS DE CONTROL
Diseño y análisis de algoritmos
ESTRUCTURA DE DATOS Unidad 01 RECURSIVIDAD.
Estructuras de Decisión I IF - THEN - ELSE
Programación II Listas
Introducción al lenguaje de especificación JML
Variables Prof. Gonzalo Pastor.
FUNCIONES EN C.
Curso de Programación I Parte III
Excepciones y archivos Info 033. Exception El término Exception es la palabra corta para la frase "evento excepcional." Definition: Una excepción es un.
Método en Java.
Recursión Se dice que un método es recursivo si forma parte de sí mismo o se define en función de sí mismo. La recursión es un medio particularmente poderoso.
Funciones y procedimientos
CI TEORIA semana 8 Subprogramas o funciones Definición de funciones.
Programación I Teoría VI: Recursividad
FUNCIONES Y PROCEDIMIENTOS
1 Procedimientos Es un conjunto de sentencias incluidas entre las declaraciones Sub o Function y End Sub/Function VB utiliza varios tipos de procedimientos:
Igor Santos Grueiro. De este tipo de pilas NO vamos a hablar.
Recursividad.
Potencias de exponente natural mayor que 1
Programación de Computadores
EXPONENTES Y RADICALES
Suponiendo que además en la clase U hay: import java.util.*; class U{ static Scanner teclado = new Scanner(System.in); static public int readInt(String.
Programación en Matlab
Repaso/resumen 1.lectura/escritura y asignación 2.funciones 3.selección de instrucciones (if-else) 4.repetición de instrucciones (while) 5.recursión 6.operadores/instrucciones.
Algoritmos numéricos. Método de “aproximación sucesiva”: se genera una hipótesis sobre la respuesta y en cada iteración se utiliza dicha hipóte- sis para.

CONCEPTOS BÁSICOS: Números Naturales
Introducción al análisis de algoritmos
Algoritmos.
Estructura de Datos y Algoritmos
Capítulo 1 “Elementos de Programación”
Descomposición Factorial Unidad 5
Material de apoyo Unidad 4 Estructura de datos
Análisis de algoritmos
Teoría – Alejandro Gonzalez
Figure: Algoritmos Conceptos básicos. Programación: 1.Establecer una secuencia de acciones que: puedan ser ejecutadas por el procesador realicen una.
Recursividad.
Estructuras de Control.
Recursividad (2 clases) 1. Nivelación Funciones Menú Vectores String
Estructuras de control Resolución de problemas y algoritmos.
Programación de Computadores (IWI-131)
Sistema Numérico Binario Prof. Carlos Rodríguez Sánchez.
CARACTERÍSTICAS Es un lenguaje de programación estructurado de propósito general. Está estrechamente asociado al sistema operativo UNIX, ya que el propio.
Oscar Bedoya. Edificio 331, 2º piso, E.I.S.C. Estructuras de datos y algoritmos.
DEV- C++ ·include <iostream> Int x x=x+2(x)
Exponentes Enteros.
PHP el Lenguaje Ejercicios Básicos.
Fundamentos de Programación
Capítulo 2 “Subprogramas/Funciones - Arreglos”
TEMA 2: POTENCIAS DE BASE ENTERA
Unidad V Recursión. Objetivos del Aprendizaje Explicar el concepto de recursión. Discutir las diferentes condiciones que deben ser satisfechas para que.
tabla // tabla sumar del 7, del 0 al 9
Conalep Coacalco Algoritmos Recursivos
“CURSO PROPEDÉUTICO PARA EL MEJORAMIENTO DEL PENSAMIENTO MATEMÁTICO”
Fundamentos de Programación
CICLOS EN C – PARTE 3.
 Las funciones son un conjunto de instrucciones que realizan una tarea específica. En general toman unos valores de entrada, llamados parámetros y proporcionan.
INTRODUCCIÓN A LA PROGRAMACIÓN ORIENTADA A OBJETOS Arreglo.
Tratamientos Secuenciales Generalizados II Fundamentos de Programación Departamento de Lenguajes y Sistemas Informáticos Unidad Didáctica 19 Versión
Estructuras de control selectivas Fundamentos de Programación Departamento de Lenguajes y Sistemas Informáticos Versión Práctica 3.
1 Métodos. 2 Un método es un conjunto de instrucciones definidas dentro de una clase, que realizan una determinada tarea y a las que podemos invocar mediante.
Tema 8: Programación estructurada Introducción La importancia del conocimiento de programación es mucho mayor de lo que se piensa. Aprender a programar.
Prof. Jonathan Silva Ingeniería Civil – Informática I Ingeniería Civil Informática I Clase 3 – Diseño de Programas.
1 Clase 6: control (1ª parte) iic1102 – introducción a la programación.
Recursividad.
Números y Fracciones 1.Los números naturales y los enterosLos números naturales y los enteros 2.Números primosNúmeros primos 3.Máximo común divisor y mínimo.
Sistema Numérico Binario Prof. Carlos Ortiz Muñoz.
Presentado por: Yuli Domínguez. Portal Educativo El mentor de matemáticas Grupo Océano MÚLTIPLOS Y DIVISORES DE UN NÚMERO.
Transcripción de la presentación:

Programación II Recursividad Igor Santos Grueiro

? “Para entender la recursividad, primero hay que entender lo qué es la recursividad” -Un programador anónimo ? Hello world

¡¿QUÉ?!

La recursividad consiste en definir una entidad en función de sí misma

Podemos definir recursivamente Tipos de datos Problemas

Definamos un tipo de datos de manera recursiva: clase Nodo Nodo siguiente Object elemento

Ejemplo de recursividad de tipos: Nodo public class Nodo{ private Object elemento; private Nodosiguiente; // Seguiría la definición … }

Ahora, a por la difícil: recursividad de ejecución o recursividad de problema

La recursividad de ejecución es la posibilidad de definir un problema en función del propio problema

¡A SÍ MISMA! Dicho de otro modo: una función que dentro de su código se llama … ¡A SÍ MISMA!

recursividad indirecta o mutua Si se llama directamente a sí misma: recursividad directa Si llama a otra a función que vuelve a llamar a la función original (1-n veces): recursividad indirecta o mutua

Se llama a sí misma directamente Recursividad directa public static int funcionRec(int n){ if (n == 0){ return 1; } else{ return n * funcionRec(n-1); Se llama a sí misma directamente

Recursividad indirecta o mutua public static boolean impar (int numero){ if (numero==0) return false; else return par(numero-1); } public static boolean par (int numero){ return true; return impar(numero-1); Se llaman entre ellas

Para que una función pueda ser recursiva tienen que cumplirse ciertos requisitos:

definirse en términos de sí misma Que pueda definirse en términos de sí misma

un criterio de finalización o “caso base” Que exista un criterio de finalización o “caso base”

Es el caso base public static int funcionRec(int n){ if (n == 0){ return 1; } else{ return n * funcionRec(n-1);

se esté más cerca de cumplirse Que en cada llamada recursiva se esté más cerca de cumplirse el Caso Base

Al ir restando 1, nos acercamos al caso base: el número es 0 public static int funcionRec(int n){ if (n == 0){ return 1; } else{ return n * funcionRec(n-1);

Que se resuelva el problema en un tiempo limitado o finito

cálculo del factorial de un número Un ejemplo mítico: el cálculo del factorial de un número x!

Lo definimos matemáticamente Solución iterativa: x! = 1 · 2 · … · (x -1) · x Solución recursiva: Si x = 0  x! = 1 Si x > 0  x! = x · (x-1)!

Solución iterativa en Java public static int factorial(int n){ int fact = 1; for (int i = 1 ; i <= n ; i++){ fact *= i; } return fact;

Haced la solución recursiva del procedimiento de cálculo del factorial de un número

1 Definimos el caso base El factorial de 0 es 1 public static int factorial(int n){ if (n == 0){ return 1; } El factorial de 0 es 1

acercándonos al caso base 2 Llamamos a la función acercándonos al caso base public static int factorial(int n){ if (n == 0){ return 1; } else{ return n * factorial(n-1);

Ejemplo n= 3 n Valor de retorno 6 3 2 1 3 * 2 * 1 * 1 public static int factorial (int n){ if (n == 0){ return 1; } else{ return n * factorial(n-1); n 3 2 1 Valor de retorno 6 3 * 2 * 1 * 1

¡Hecho!

Ejercicio: Escribir un programa que calcule todos los factoriales del 1 hasta el valor entero N que se introduce por teclado, el valor de N es mayor de cero. Ejercicio 1 Diseñad un método que calcule la potencia de un numero real elevado a un entero (en función de multiplicaciones sucesivas). Tanto solución iterativa como recursiva

Solución iterativa public static double potencia(double base, int exp){ double pot = 1; for (int i=1; i<= exp; i++){ pot = pot * base; } return pot;

Solución recursiva public static double potencia(double base, int exp){ if (exp == 0) return 1; else return (base * potencia(base, exp - 1)); }

Ejercicio: Escribir un programa que calcule todos los factoriales del 1 hasta el valor entero N que se introduce por teclado, el valor de N es mayor de cero. Ejercicio 2 Escribid un método que calcule la suma de los N (N>0) primeros números naturales. Solución recursiva

Solución recursiva primera versión public static int sumaNaturales(int n) { // Caso base: la suma de los números hasta 0 es 0 if (n == 0) return 0; else return (n + sumaNaturales(n - 1)); }

Solución recursiva segunda versión public static int sumaNaturales(int n) { // Caso base: la suma de los números hasta 1 es 1 if (n == 1) return 1; else return (n + sumaNaturales(n - 1)); }

Ejercicio: Escribir un programa que calcule todos los factoriales del 1 hasta el valor entero N que se introduce por teclado, el valor de N es mayor de cero. Ejercicio 3 Escribid un método que visualice los N primeros números naturales del 1 al N Solución recursiva

Solución recursiva public static void visualizarNumerosHastaN(int n) { if (n > 0) { visualizarNumerosHastaN(n - 1); System.out.println(n); } // Caso base: Si hemos llegado a 0 no muestro // nada

Ejercicio: Escribir un programa que calcule todos los factoriales del 1 hasta el valor entero N que se introduce por teclado, el valor de N es mayor de cero. Ejercicio 4 Escribir un método que visualice los N primeros números naturales del N al 1 Solución recursiva

Solución recursiva public static void visualizarNumerosDesdeN(int n) { if (n > 0) { System.out.println(n); // Se hace después la llamada para ir de // N a 1 visualizarNumerosDesdeN(n - 1); } // Caso base: Si hemos llegado a 0 no muestro // nada

Ejercicio: Escribir un programa que calcule todos los factoriales del 1 hasta el valor entero N que se introduce por teclado, el valor de N es mayor de cero. Ejercicio 5 Escribid un método que visualice los dígitos de un número natural N al revés N = 7815  visualizar el numero 5187

Solución recursiva public static void visualizarDigitosReves(int n) { // El caso base es que hemos llegado // al último digito (<10) if (n < 10) { System.out.println(n); } else { System.out.print(n % 10); visualizarDigitosReves(n / 10); }

Ejercicio: Escribir un programa que calcule todos los factoriales del 1 hasta el valor entero N que se introduce por teclado, el valor de N es mayor de cero. Ejercicio 6 Escribid un método que visualice los dígitos de un número natural N, uno por línea.

Solución recursiva public static void visualizarDigitos(int n) { // El caso base es que hemos llegado // al último digito (<10) if (n < 10){ System.out.println(n); }else { int digito = n % 10; visualizarDigitos(n / 10); System.out.println(digito); }

Ejercicio 7 Escribid un método que sirva para subrayar un texto Escribir un programa que calcule todos los factoriales del 1 hasta el valor entero N que se introduce por teclado, el valor de N es mayor de cero. Ejercicio 7 Escribid un método que sirva para subrayar un texto

Solución recursiva public static void subrayar(int longitud){ if (longitud > 0) { System.out.print("_"); subrayar(longitud-1); } // El caso base es que la longitud sea 0

Ejercicio: Escribir un programa que calcule todos los factoriales del 1 hasta el valor entero N que se introduce por teclado, el valor de N es mayor de cero. Búsqueda binaria Escribid un método que busque un valor en un array de enteros de un modo dicotómico (el array está ordenado de menor a mayor).

Búsqueda dicotómica o binaria 1 3 5 8 9 Devolvemos la posición del valor medio: 1 Valor medio 1 3 Si el valor medio es mayor que el valor a buscar … Como el valor medio es igual que el valor a buscar Valor medio Valor a buscar 3

Solución recursiva public static int busquedaBinaria(int [] aEnteros, int valor, int rangoMenor, int rangoMayor){ int med = (rangoMayor - rangoMenor)/2 + RangoMenor; if (rangoMenor > rangoMayor){ return -1; } else if (aEnteros[med] < valor){ return busquedaBinaria (aEnteros, valor, med + 1,rangoMayor); else if (aEnteros[med] > valor){ (aEnteros, valor, rangoMenor, med - 1); else{ return med;

Ejercicio: Escribir un programa que calcule todos los factoriales del 1 hasta el valor entero N que se introduce por teclado, el valor de N es mayor de cero. Un ejemplo Escribir un método que sume los elementos de un array de manera recursiva

Partimos de esto public static void main(String[] args){ int [] aNumeros = {1, 3, 5, 7, 9, 11, 13}; int suma =sumarArray(aNumeros); System.out.println(suma); } public static int sumarArray(int [] a) {

añadir parámetros necesarios de la solución recursiva A veces se llama un método que llama a un método recursivo para añadir parámetros necesarios de la solución recursiva

Solución public static int sumarArray(int [] aEnteros) { sumarArrayRec(aEnteros,0); } public static int sumarArrayRec (int [] aEnteros, int pos){ // Si hemos llegado al final // del array la suma es 0 if (pos == aEnteros.length){ return 0; } else{ return aEnteros[pos] + sumarArrayRec(aEnteros, pos+1);

recursividad en concha Es lo que se conoce como recursividad en concha

Ejercicio: Escribir un programa que calcule todos los factoriales del 1 hasta el valor entero N que se introduce por teclado, el valor de N es mayor de cero. Ejercicio 1 Diseñar un método para visualizar los elementos de un array de enteros. Con recursividad en concha

Solución public static void visualizarArray(int[] aEnteros) { visualizarArrayRec(aEnteros, aEnteros.length - 1); } public static void visualizarArrayRec(int[] aEnteros, int pos){ if (pos >= 0) { visualizarArrayRec(aEnteros, pos - 1); System.out.println(aEnteros[pos]);

Ejercicio: Escribir un programa que calcule todos los factoriales del 1 hasta el valor entero N que se introduce por teclado, el valor de N es mayor de cero. Ejercicio 2 Diseñar un método para visualizar los elementos de un fichero de alumnos (Alumno tiene un método mostrar)

Solución public static void visualizarAlumnos (String nFic) throws Exception{ FileInputStream fis = new FileInputStream(nFic); ObjectInputStream ois = new ObjectInputStream(fis); visualizarAlumnosRec(ois); ois.close(); } public static void visualizarAlumnosRec (ObjectInputStream ois) throws Exception{ Alumno a = (Alumno) ois.readObject(); if (a != null){ a.mostrar(); visualizarAlumnosRec (ois);

recursividad múltiple Ahora, a por la recursividad múltiple Cuando una función se llama a sí misma varias veces

La serie de Fibonacci f(0) = 0 f(1) = 1 f(n) = f(n-1) + f(n-2)

Ejercicio: Escribir un programa que calcule todos los factoriales del 1 hasta el valor entero N que se introduce por teclado, el valor de N es mayor de cero. Ejercicio 1 Realizar una función recursiva que calcule el termino n de la serie de Fibonacci

Solución public static int fibonacci(int n){ // Caso base primero si el término es 0 // entonces es 0 if (n == 0){ return 0; } // Caso base segundo si el término es 1 // entonces 1 else if (n == 1){ return 1; // Caso recursivo. Se llama dos veces a la // función recursiva else{ return fibonacci(n-1) + fibonacci(n-2);

Ejercicio: Escribir un programa que calcule todos los factoriales del 1 hasta el valor entero N que se introduce por teclado, el valor de N es mayor de cero. Ejercicio 2 Diseñar un método para calcular el número combinatorio de “m” elementos tomados de “n” en “n”.

Primera forma de solución: Cm,n = m! / n!(m-n)!

No tiene recursividad propia

Segunda forma de solución: Iterativa Cm,n = 1 * (m-1+1) / 1 * (m-2+1) / 2 * ... *(m-i+1) / i

No tiene recursividad

Tercera forma de solución: Recursividad Directa Simple si n = 0 Cm,n = 1 si n > 0 Cm,n = Cm,n-1 * (m-n+1) / n

Solución public static int combinacionesSimple(int m , int n){ if (n == 0){ return 1; } else{ return combinacionesSimple(m, n - 1) * (m – n + 1)/n;

Cuarta forma de solución: Recursividad Directa Múltiple si n = 0 Cm,n = 1 si n = m Cm,n = 1 si n > m Cm,n = 0 si m > n > 0 Cm,n = Cm-1,n + Cm-1,n-1

Solución public static int combinacionesMultiple (int m , int n){ if (n == 0 || m == n){ return 1; } else{ return combinacionesMultiple(m -1 ,n) * combinacionesMultiple(m-1 , n - 1);

Para entender la recursividad, había que saber lo qué era la recursividad

La recursividad NO es eficiente

La recursividad proporciona soluciones elegantes

“Hay pocas virtudes sin prudencia” -Marco Tulio Cicerón