Autor Tema: Conversión de un numero decimal a base "n" con recursividad en JAVA caso base  (Leído 1910 veces)

Sergio Perez

  • Sin experiencia
  • *
  • APR2.COM
  • Mensajes: 14
    • Ver Perfil
Buen día a todos!!! Espero me puedan orientar, tengo el siguiente código:

Código: [Seleccionar]
import javax.swing.JOptionPane; //Clase Decimal.java

public class Decimal
{
        public static void main(String[] args)
        {
        int numero = Integer.parseInt(JOptionPane.showInputDialog(null,"Ingrese el número en base 10: "));                                                                                     
       
        int base = Integer.parseInt(JOptionPane.showInputDialog(null,"Ingrese la base a transformar..."));
        Base bases = new Base(numero,base);
        bases.transformar();
        JOptionPane.showMessageDialog(null,"El número "+numero+" en base "+base+" es:\n"+bases.getResultado());               
       
        }
}

class Base //Clase Base.java
{
String equivalente; 
int posicion; 
int numero; 
int base; 
int[] digitos;
int[] auxiliar;
                 
        public Base(int n, int b)
        {
                posicion = 0;
                equivalente = "";
                base = b;
                numero = n;
                digitos = new int [1];
        }
                           
        public void transformar()
        {
                if(numero<base)
                {
                        digitos[posicion]=numero;
                        tamaño();
                }
                else
                {
                        digitos[posicion]=numero%base;
                        tamaño();
                        posicion++;
                        numero = numero/base;
                        transformar();
                 }
        }
                 
        public String getResultado()
        {
                for (int j = digitos.length-2; j >= 0; j--)
                {
                        equivalente+=Character.toUpperCase(Character.forDigit(digitos[j], 16));
                }
                return equivalente;
        }
                               
        private void tamaño()
        {
                 auxiliar = digitos;
                 digitos = new int [auxiliar.length+1];
                 System.arraycopy(auxiliar, 0, digitos, 0, auxiliar.length);
        }
}


El problema que tengo es si hay una manera de sustuir el "for" que tengo en la siguiente parte de clase "Base" :

Citar
public String getResultado()
        {
                for (int j = digitos.length-2; j >= 0; j--)
                {
                        equivalente+=Character.toUpperCase(Character.forDigit(digitos[j], 16));
                }
                return equivalente;

        }

por algún "if-else" ya que según tengo entendido no se puede utilizar "for o while" para la recursividad  :(
« Última modificación: 11 de Enero 2022, 20:30 por Ogramar »

Kabuto

  • Moderador Global
  • Experto
  • *******
  • Mensajes: 989
    • Ver Perfil
Para que un método recursivo funcione ha de recibir parámetros por argumentos, los cuáles se van modificando en cada llamada recursiva.

Así que si quieres seguir usando getResultado() tal cuál, quizás se pueda solucionar creando un segundo método de apoyo, que sería el recursivo.
Por cierto, al margen de esto, el String llamado equivalencia que tienes declarado como atributo de clase, debería reiniciarse a "cadena vacía" cada vez que llamas al método getResultado().
Si durante la ejecución del programa solo llamas una vez a ese método, no pasa nada.
Pero si se le llamase varias veces, cada vez que se le llama se concatenará la equivalencia computada anteriormente con la actual.

De hecho, no parece que sea necesario declarar ese String como atributo de clase, pero bueno, si lo quieres mantener así, y resolver el computo de manera recursiva, quizás funcione algo como lo que pondré a continuación.
No lo he probado..., en mi "compilador mental" diría que funciona je je...  ;D, pero no es muy fiable así que si no funciona o da resultados raros, dímelo y ya haré pruebas más fiables.

Un saludo.

Código: [Seleccionar]
        public String getResultado()
        {
                equivalente = ""; //Reiniciamos a cadena vacía
                equivalente = computaEquivalencia(digitos.length-2); //Método recursivo
                return equivalente;
        }

        private String computaEquivalencia(int indice)
        {
                if (indice < 0)
                        return ""; //Fin de las llamadas recursivas
                else
                        return Character.toUpperCase(Character.forDigit(digitos[indice], 16)) + computaEquivalencia(--indice);
        }
NO respondo dudas por mensaje privado
Publicando vuestras dudas en el foro público conseguimos:
- Que más gente aporte respuestas mejores o complementarias.
- Que otras personas puedan aprender de vuestras dudas.

Mejor en PÚBLICO que en privado. Gracias

Sergio Perez

  • Sin experiencia
  • *
  • APR2.COM
  • Mensajes: 14
    • Ver Perfil
Que grande que sos Kabuto!!!  8)

No había tomado en cuenta lo de la concatenación que mencionas por las prisas pero corre bastante bien, de verdad que ha sido de gran ayuda  :D :D :D


 

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