Autor Tema: recursión Java diferencia entre solución recursiva e iterativa ejemplo CU00644B  (Leído 1842 veces)

Juanfran.ib

  • Sin experiencia
  • *
  • APR2.COM
  • Mensajes: 9
    • Ver Perfil
Subo mi solución propuesta para el ejercicio CU00644B del curso básico de algoritmia y programación con Java de aprenderaprogramar:

Código: [Seleccionar]
/**
 * MultiplicadorDieces
 *
 * @author (Juanfran.ib)
 * @version (20/07/2023)
 */

public class MultiplicadorDieces
{//nada que declarar

    public MultiplicadorDieces(){//constructor vacío
    }

    public double multiplicarPorDieces (double a, int b){
        if (b==0) { return 1;}
        else {double potencia = 10 * multiplicarPorDieces (1, b-1);return a*potencia;}
    }
}

Saludos y gracias por este excelente curso.
« Última modificación: 08 de Agosto 2023, 09:10 por Ogramar »

Ogramar

  • Moderador Global
  • Experto
  • *******
  • Mensajes: 2660
    • Ver Perfil
Buenas, para quien revise este ejercicio comentar algunas cuestiones:

- Si introducimos como datos de entrada (2.55, 2) el resultado esperado sería 255 pero al menos yo he obtenido 254,9999999... Este problema de "precisión decimal" relacionado con la forma que tienen los computadores de representar valores numéricos se comenta en https://aprenderaprogramar.com/foros/index.php?topic=1972.0 (en este hilo se presenta una solución del ejercicio de forma clásica o iterativa).

- Una peculiaridad que tiene esta forma de resolver el ejercicio es que hace uso de la recursión (ésta no se trata en el curso, por tanto no es necesario resolver el ejercicio de esta manera). Recursión es la llamada a un método por parte de ese mismo método, generando una "cascada de llamadas" que no se resuelve hasta que se llega a un "caso base" que permite determinar una solución. En este caso si llamamos  multiplicarPorDieces (30, 2) tenemos

 -- Invocación 1: devuelve 30*10*multiplicarPorDieces(1, 1)
 -- Invocación 2: devuelve 10*multiplicarPorDieces(1, 0)
 -- Invocación 3: devuelve 1, esto permite resolver
 -- Resolución de invocación 2 a partir de la 3: 10*1
 -- Resolución de invocación 1 a partir de la 2: 30*10*10*1 = 3000

La recursividad resulta más compleja de manejar y de plantear que la solución clásica (iterativa), por ello muchos programadores prefieren no usarla, aunque es una técnica que puede ser interesante. En el hilo https://aprenderaprogramar.com/foros/index.php?topic=1536.0 puede verse otra solución recursiva, junto a otra solución iterativa clásica.

En este ejercicio posiblemente dejar la recursión con un único parámetro para obtener la potencia, en lugar de hacer recursiones con dos parámetros (si nos fijamos al usar multiplicarPorDieces44 (1, b-1) la recursión se hace siempre con el primer parámetro fijado como 1, lo cual no parece muy eficiente.

Quien lo desee, puede profundizar en determinar las diferencias entre las dos soluciones recursivas propuestas y las soluciones iterativas clásicas.

Salu2
« Última modificación: 27 de Agosto 2023, 19:59 por Ogramar »

 

Sobre la educación, sólo puedo decir que es el tema más importante en el que nosotros, como pueblo, debemos involucrarnos.

Abraham Lincoln (1808-1865) Presidente estadounidense.

aprenderaprogramar.com: Desde 2006 comprometidos con la didáctica y divulgación de la programación

Preguntas y respuestas

¿Cómo establecer o cambiar la imagen asociada (avatar) de usuario?
  1. Inicia sesión con tu nombre de usuario y contraseña.
  2. Pulsa en perfil --> perfil del foro
  3. Elige la imagen personalizada que quieras usar. Puedes escogerla de una galería de imágenes o subirla desde tu ordenador.
  4. En la parte final de la página pulsa el botón "cambiar perfil".