Descargar la presentación
La descarga está en progreso. Por favor, espere
1
Programación II Recursividad
Igor Santos Grueiro
2
? “Para entender la recursividad, primero hay que entender lo qué
es la recursividad” -Un programador anónimo ? Hello world
3
¡¿QUÉ?!
4
La recursividad consiste en definir una entidad en función de sí misma
5
Podemos definir recursivamente
Tipos de datos Problemas
6
Definamos un tipo de datos de manera recursiva: clase Nodo
Nodo siguiente Object elemento
7
Ejemplo de recursividad de tipos: Nodo
public class Nodo{ private Object elemento; private Nodosiguiente; // Seguiría la definición … }
8
Ahora, a por la difícil: recursividad de ejecución o recursividad de problema
9
La recursividad de ejecución es la posibilidad de definir un problema en función del propio problema
10
¡A SÍ MISMA! Dicho de otro modo: una función que dentro
de su código se llama … ¡A SÍ MISMA!
11
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
12
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
13
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
14
Para que una función pueda ser recursiva tienen que cumplirse
ciertos requisitos:
15
definirse en términos de sí misma
Que pueda definirse en términos de sí misma
16
un criterio de finalización o “caso base”
Que exista un criterio de finalización o “caso base”
17
Es el caso base public static int funcionRec(int n){ if (n == 0){
return 1; } else{ return n * funcionRec(n-1);
18
se esté más cerca de cumplirse
Que en cada llamada recursiva se esté más cerca de cumplirse el Caso Base
19
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);
20
Que se resuelva el problema en un tiempo limitado o finito
21
cálculo del factorial de un número
Un ejemplo mítico: el cálculo del factorial de un número x!
22
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)!
23
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;
24
Haced la solución recursiva del procedimiento de cálculo del
factorial de un número
25
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
26
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);
27
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
28
¡Hecho!
29
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
30
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;
31
Solución recursiva public static double potencia(double base, int exp){ if (exp == 0) return 1; else return (base * potencia(base, exp - 1)); }
32
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
33
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)); }
34
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)); }
35
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
36
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
37
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
38
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
39
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
40
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); }
41
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.
42
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); }
43
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
44
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
45
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).
46
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
47
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;
48
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
49
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) {
50
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
51
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);
52
recursividad en concha
Es lo que se conoce como recursividad en concha
53
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
54
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]);
55
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)
56
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);
57
recursividad múltiple
Ahora, a por la recursividad múltiple Cuando una función se llama a sí misma varias veces
58
La serie de Fibonacci f(0) = 0 f(1) = 1 f(n) = f(n-1) + f(n-2)
59
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
60
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);
61
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”.
62
Primera forma de solución:
Cm,n = m! / n!(m-n)!
63
No tiene recursividad propia
64
Segunda forma de solución: Iterativa
Cm,n = 1 * (m-1+1) / 1 * (m-2+1) / 2 * *(m-i+1) / i
65
No tiene recursividad
66
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
67
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;
68
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
69
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);
70
Para entender la recursividad, había que saber
lo qué era la recursividad
71
La recursividad NO es eficiente
72
La recursividad proporciona soluciones elegantes
73
“Hay pocas virtudes sin prudencia”
-Marco Tulio Cicerón
Presentaciones similares
© 2024 SlidePlayer.es Inc.
All rights reserved.