Deber 3. Ejercicios de Recursividad

Descargar como docx, pdf o txt
Descargar como docx, pdf o txt
Está en la página 1de 9

ESCUELA POLITÉCNICA NACIONAL FACULTAD DE

INGENIERÍA DE SISTEMAS INGENIERÍA DE SOFTWARE

Deber de Estructura de Datos ISWR453

Deber No.: 3. Recursividad

Integrantes:
 Kevin Rivadeneira
 Marcela Montalvo
 Danny Cabrera

Marco Teórico:

Algoritmos recursivos
Los algoritmos recursivos se basan en la metodología de llamar repetidamente la propia función en que
están definidos, y son de gran utilidad en multitud de campos en la informática. Se dice que un
algoritmo es recursivo si dentro del cuerpo del algoritmo y de forma directa o indirecta se realiza una
llamada a él mismo.

¿Qué es la recursividad?
Es una técnica de programación que busca resolver un problema sustituyéndolo por otros problemas de
la misma categoría, pero más simples.

¿Qué es un caso base?


Caso base o condición de salida es el caso trivial de un algoritmo recursivo del cual conocemos su
solución, es decir, que no vuelva a invocarse y que se ejecuta cuando se cumple cierta condición.
[ CITATION Mat18 \l 12298 ]

Importante:
Al escribir un algoritmo recursivo, debe establecerse de algún modo cuando debe dejar de llamarse a sí
mismo, o de otra forma se repetiría indefinidamente. Para ello, se establece una condición de salida
llamada caso base.

Todo algoritmo recursivo debe incluir al menos un caso base y garantizar que se ejecuta en algún
momento para evitar la recursividad infinita.

¿Se puede transformar de formas iterativas a recursivas?


La mayoría de los algoritmos que pueden ser descritos de forma iterativa hacen uso de bucles while o
for y pueden ser reescritos de forma recursiva, y viceversa. [ CITATION Mar172 \l 12298 ]

Tipos de recursividad [ CITATION Beg18 \l 12298 ]


 Según el punto desde el cual se hace la llamada recursiva.
Directa: Se da cuando la función
efectúa una llamada a sí misma

Indirecta: Se da cuando una


función A llama a otra función B
la cual, a su vez, y de forma
directa o indirecta, llama
nuevamente a A.

 Según el número de llamadas recursivas efectuadas en tiempo de ejecución.


Lineal o simple: Se da cuando la
recursividad es directa y además
cada llamada a la función
recursiva sólo hace una nueva
llamada recursiva.

No lineal o múltiple: La ejecución


de una llamada recursiva da lugar
a más de una llamada a la función
recursiva.

 Según el punto del algoritmo desde donde se efectúa la llamada recursiva.

Final: Se da cuando la llamada


recursiva es la última operación
efectuada en el cuerpo de la
función. (sin tener en cuenta la
sentencia devolver)

Se da cuando la llamada
recursiva no es la última
operación realizada dentro de
la función (sin tener en cuenta
la sentencia devolver)
[ CITATION Beg18 \l 12298 ]
1. Implementar un programa que permita la impresión de los elementos de un
array de forma recursiva e iterativa. Calcular el tiempo de ejecución de cada
una de las formas.
Código:
package Ej1;

public class Main {

public static void main(String[] args) {


int [] array = {11,55,62,74,31,56,41,23};

//Impresión de array de forma iterativa


long startTime = System.nanoTime();
System.out.println("Array impreso de forma iterativa");
for(int i = 0; i<array.length; i++){
System.out.print(array[i]+" | ");
}
System.out.println("");
long endTime = System.nanoTime() - startTime;
System.out.println("Tiempo de ejecución --> "+endTime);

//Impresión de array de forma recursiva


long startTime2 = System.nanoTime();
System.out.println("Array impreso de forma recursiva");
imprimirRecursivo(0, array);
System.out.println("");
long endTime2 = System.nanoTime() - startTime;
System.out.println("Tiempo de ejecución --> "+endTime);

public static void imprimirRecursivo(int pos, int [] array){


if (pos == array.length-1) { System.out.println(array[pos]+" | ");}
else {
System.out.print(array[pos]+" | ");
imprimirRecursivo(pos+1, array);
}
}
}

Resultados:
El algoritmo iterativo tiende a ser más eficiente que el algoritmo recursivo ya que posee un orden que lo hace
más eficiente.

2. Implementar un programa que calcule el máximo común divisor de dos


números enteros tanto de forma recursiva como iterativa.
Código:
package Negocio;
public class Recursivdad {
/**
* Máximo común divisor en Java con el algoritmo de Euclides
* implementado con ciclo while y con recursión / recursividad
*/
//Método para calcular MCD de forma iterativa
public static int maximo_comun_divisor(int a, int b) {
int temporal;//Para no perder b
while (b != 0) { //Itera o repite el bucle
temporal = b;
b = a % b;
a = temporal;
}
return a;
}
//Metodo para calcular MCD de forma recursiva
public static int maximo_comun_divisor_recursivo(int a, int b) {
if (b == 0) return a;
return maximo_comun_divisor_recursivo(b, a % b);//Se llama a sí mismo
}
public static void main(String[] args) {
System.out.println("MCD de 50 y 120: \n" + maximo_comun_divisor(50, 120));
System.out.println("MCD de 50 y 120 (recursivo): \n" +
maximo_comun_divisor_recursivo(50, 120));
System.out.println("MCD de 7 y 5: \n" + maximo_comun_divisor(7, 5));
System.out.println("MCD de 7 y 5 (recursivo): \n"+
maximo_comun_divisor_recursivo(7, 5));
}
}

Resultados:

Código:
Iterativo
package Negocio;

import java.util.Scanner;
public class Iterativo {
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
System.out.println("Ingrese el primer número");
int num1 = scan.nextInt();
System.out.println("Ingrese el segundo número");
int num2 = scan.nextInt();

// Seleccionamos el mayor y el manor para asignarlos


// a las variables "a" y "b" respectivamente
int a = Math.max(num1, num2);
int b = Math.min(num1, num2);
// Declaramos la variable que guardará el resultado
int res;
// Creamos el ciclo que realizará las iteraciones
do {
// Le asignamos al resultado el valor de b.
// Si la primera división da exacta, el mcd será
// el menor de los dos, es decir "b".
res = b;
// Le asignamos a la variable "b" el valor del resto
// de la división entre "a" y "b", de tal forma que
// "b" siempre se convertirá en el divisor de la
// proxima iteración
b = a%b;
// El dividendo de la proxima iteración, es decir "a"
// será entonces el resto de la anterior iteración
a = res;
} while (b!=0);
// El proceso se repite hasta que "b" sea diferente
// de cero. Es decir, como "b" es el resultado de sacar
// Mostramos el resultado en pantalla
System.out.println("El M.C.D entre "+num1+" y "+num2+" es: " + res);
}
}
Resultados:
3. Consultar e implementar 2 ejercicios que apliquen recursividad para su solución.
Los ejercicios deberán ser diferentes a los vistos en clase y en la práctica de
laboratorio.
Invertir un numero de forma recursiva
Código:
package ejercicio3;
import java.util.Scanner;

public class item1 {

public static void main(String[] args) {

Scanner entrada = new Scanner(System.in);


System.out.print("Ingrese numero: ");
int numero = entrada.nextInt();
String num = numero+"";
int pos = num.length();
System.out.println(invertirNum(numero, pos-1));

public static int invertirNum(int num, int pos) {

if (num < 10){


return num;
}else{
return (num % 10) * (int) Math.pow(10, pos) + (invertirNum(num/10, pos-
1));
}
}
}
Resultados
Suma los dígitos de un numero de forma recursiva.

Código:
package ejercicio3;
import java.util.Scanner;

public class item2 {


public static void main(String[] args) {
Scanner entrada = new Scanner(System.in);
System.out.print("Ingrese numero: ");
int numero = entrada.nextInt();
System.out.println(sumaDigitos(numero));
}

public static int sumaDigitos(int numero) {


if (numero < 10) {
return numero;
} else {
return (numero % 10) + sumaDigitos(numero / 10);
}
}
}

Resultados
Conclusiones:
 Los algoritmos iterativos tienden a ser más eficientes que los algoritmos recursivos según un
problema en particular, ya que poseen un orden que los hace más eficientes
 Por medio del análisis de tiempos de ejecución donde claramente los algoritmos iterativos se
realizan en menor tiempo que los recursivos siendo así estos más eficientes.
 Se debe emplear algoritmos recursivos cuando no se tengan que realizar múltiples llamados al
mismo método ya que resultan ser ineficientes.
Referencias
[1] M. García, «Algoritmos y Diagramación,» 2018. [En línea]. Available:
http://www.profmatiasgarcia.com.ar/uploads/tutoriales/Algoritmos_con_recursividad.pdf. [Último acceso:
15 08 2021].
[2] M. Peralta, «Formación desarrollando,» 2017. [En línea]. Available:
http://formacion.desarrollando.net/cursosfiles/formacion/curso_454/deda-03.pdf. [Último acceso: 15 08
2021].
[3] B. Martinez, «Repositorio Jaume I,» 2018. [En línea]. Available:
http://repositori.uji.es/xmlui/bitstream/handle/10234/119828/tema9.pdf?sequence=1&isAllowed=y. [Último
acceso: 15 08 2021].

También podría gustarte