La descarga está en progreso. Por favor, espere

La descarga está en progreso. Por favor, espere

Programación II Recursividad

Presentaciones similares


Presentación del tema: "Programación II Recursividad"— Transcripción de la presentación:

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


Descargar ppt "Programación II Recursividad"

Presentaciones similares


Anuncios Google