Buscar
Social
Ofertas laborales ES

Foro sobre Java SE > Ayuda con programa de Recursividad

Hola amigo que tal, eh estado intentando hacer un programa recursivo que convierta un numero hexadecimal a decimal y me sale un error de StackOverFlow, necesito su ayuda!, les dejo aqui el codigo,de mi metodo hexa:

public long hexa(String n,int j){
long suma=0;
StringBuilder num=new StringBuilder(n).reverse();
int i=num.length()-1;
if(i<=0){return 1;}else{
if(num.charAt(i)=='A'){
suma+=10*(Math.pow(16, i));
}else if(num.charAt(i)=='B'){
suma+=11*(Math.pow(16, i));
}else if(num.charAt(i)=='C'){
suma+=12*(Math.pow(16, i));
}else if(num.charAt(i)=='D'){
suma+=13*(Math.pow(16, i));
}else if(num.charAt(i)=='E'){
suma+=14*(Math.pow(16, i));
}else if(num.charAt(i)=='F'){
suma+=15*(Math.pow(16, i));
}else{
suma = suma + Integer.parseInt(""+num.charAt(i))* (long)Math.pow(16,i);
}

return suma + hexa(n,i-1);}
}

noviembre 19, 2016 | Unregistered Commenterchay

Hola, te doy una primera pista de por donde van los tiros:

aqui:

int i=num.length()-1;

y es el caracter por el que vas a comprobar, siempre estas pasandole el ultimo caracter y se queda como una recursividad infitinita y por eso el stack overflow, Y deberia tomar el valor del segundo parametro(j), que no lo estas usando para nada, y quedar asi:


int i=j-1;

Seria como tu lo tienes, si fueras eliminando un caracter de la cadena en hexadecimal, de esa manera si serviría como lo tenias. Bueno resumiendo, para evitar el stackOverflow,
quedaria:

public long hexa(String n, int j) {
long suma = 0;
StringBuilder num = new StringBuilder(n).reverse();
int i = j-1;
if (i <= 0) {
return 1;
} else {
if (num.charAt(i) == 'A') {
suma += 10 * (Math.pow(16, i));
} else if (num.charAt(i) == 'B') {
suma += 11 * (Math.pow(16, i));
} else if (num.charAt(i) == 'C') {
suma += 12 * (Math.pow(16, i));
} else if (num.charAt(i) == 'D') {
suma += 13 * (Math.pow(16, i));
} else if (num.charAt(i) == 'E') {
suma += 14 * (Math.pow(16, i));
} else if (num.charAt(i) == 'F') {
suma += 15 * (Math.pow(16, i));
} else {
suma = suma + Integer.parseInt("" + num.charAt(i)) * (long) Math.pow(16, i);
}

return suma + hexa(n, i - 1);
}
}

Así evitas la rellamada a la función así misma de forma infinita. Ahora, he probado a convertir un código hexadecimal y la solución no ha sido correcta. Eso te lo dejo para que tu veas que pasa.

Un saludo

noviembre 19, 2016 | Registered Commenterloderain

Muchas gracias si ha servido!, ahora la cuestion es que el resultado sale menor a lo esperado por ejemplo A7=167 y el programa arroja 161.

noviembre 19, 2016 | Unregistered Commenterchay

hola de nuevo, piensa en cuando i==0, ¿Realmente debe devolver 1, o en realidad debería devolver 0..9 o 10 en caso de A, 11 en caso de B, 12 en caso de C,...?

Porque..¿Que diferencia hay entre 161 y 167?

Un saludo

noviembre 19, 2016 | Registered Commenterloderain