790 likes | 1.09k Views
Igor Santos Grueiro. Programación II Recursividad. “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.
E N D
Igor Santos Grueiro Programación IIRecursividad
“Para entender la recursividad, primero hay que entender lo qué es la recursividad” -Un programador anónimo ? Helloworld
La recursividadconsiste 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 publicclass Nodo{ privateObject elemento; privateNodosiguiente; // 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
Dicho de otro modo: una función que dentro de su código se llama … ¡A SÍ MISMA!
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
Recursividad directa publicstaticintfuncionRec(int n){ if (n == 0){ return 1; } else{ returnn * funcionRec(n-1); } } Se llama a sí misma directamente
Recursividad indirecta o mutua publicstaticbooleanimpar (int numero){ if (numero==0) return false; else return par(numero-1); } publicstaticboolean par (int numero){ if (numero==0) return true; else return impar(numero-1); } Se llaman entre ellas
Para que una función pueda ser recursiva tienen que cumplirse ciertos requisitos:
Que pueda definirse en términos de sí misma
Que exista un criterio de finalización o “caso base”
Es el caso base publicstaticintfuncionRec(int n){ if (n == 0){ return 1; } else{ returnn * funcionRec(n-1); } }
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 publicstaticintfuncionRec(int n){ if (n == 0){ return 1; } else{ returnn * funcionRec(n-1); } }
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 publicstaticintfactorial(int n){ intfact = 1; for (int i = 1 ; i <= n ; i++){ fact *= i; } returnfact; }
Haced la solución recursiva del procedimiento de cálculo del factorial de un número
1 Definimos el caso base publicstaticintfactorial(int n){ if (n == 0){ return 1; } } El factorial de 0 es 1
2 Llamamos a la función acercándonos al caso base publicstaticintfactorial(int n){ if (n == 0){ return 1; } else{ returnn * factorial(n-1); } }
Ejemplo n= 3 publicstaticintfactorial (int n){ if (n == 0){ return 1; } else{ returnn * factorial(n-1); } } n 3 2 0 1 3 * Valor de retorno 6 2 * 1 * 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 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, intexp){ double pot = 1; for (inti=1; i<= exp; i++){ pot = pot * base; } return pot; }
Solución recursiva • public static double potencia(double base, intexp){ • 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 publicstaticintsumaNaturales(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 publicstaticintsumaNaturales(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 • publicstaticvoidvisualizarNumerosHastaN(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 publicstaticvoidvisualizarNumerosDesdeN(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 • publicstaticvoidvisualizarDigitosReves(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 publicstaticvoidvisualizarDigitos(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: 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 voidsubrayar(intlongitud){ 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 intbusquedaBinaria(int [] aEnteros, int valor, intrangoMenor, intrangoMayor){ int med = (rangoMayor - rangoMenor)/2 + RangoMenor; if (rangoMenor > rangoMayor){ return -1; } else if (aEnteros[med] < valor){ returnbusquedaBinaria (aEnteros, valor, med + 1,rangoMayor); } else if (aEnteros[med] > valor){ returnbusquedaBinaria (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}; intsuma =sumarArray(aNumeros); System.out.println(suma); } public static intsumarArray(int [] a) { }
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