1 / 73

Programación II Recursividad

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.

yeva
Télécharger la présentation

Programación II Recursividad

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Igor Santos Grueiro Programación IIRecursividad

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

  3. ¡¿QUÉ?!

  4. La recursividadconsiste 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 publicclass Nodo{ privateObject elemento; privateNodosiguiente; // 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. Dicho de otro modo: una función que dentro de su código se llama … ¡A SÍ MISMA!

  11. 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. Recursividad directa publicstaticintfuncionRec(int n){ if (n == 0){ return 1; } else{ returnn * funcionRec(n-1); } } Se llama a sí misma directamente

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

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

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

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

  17. Es el caso base publicstaticintfuncionRec(int n){ if (n == 0){ return 1; } else{ returnn * funcionRec(n-1); } }

  18. 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 publicstaticintfuncionRec(int n){ if (n == 0){ return 1; } else{ returnn * funcionRec(n-1); } }

  20. Que se resuelva el problema en un tiempo limitado o finito

  21. 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 publicstaticintfactorial(int n){ intfact = 1; for (int i = 1 ; i <= n ; i++){ fact *= i; } returnfact; }

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

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

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

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

  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, intexp){ double pot = 1; for (inti=1; i<= exp; i++){ pot = pot * base; } return pot; }

  31. Solución recursiva • public static double potencia(double base, intexp){ • 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 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)); }

  34. 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)); }

  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 • publicstaticvoidvisualizarNumerosHastaN(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 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 }

  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 • 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); • } • }

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

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

  44. 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 }

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

  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}; intsuma =sumarArray(aNumeros); System.out.println(suma); } public static intsumarArray(int [] a) { }

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

More Related