java - suma - Conversión de cadena de dígitos binarios a número decimal... mediante recursión
suma recursiva (3)
El profesor de informática nos dio este problema en nuestra tarea ... No estoy seguro de cómo proceder y el código que he escrito parece estar fallando miserablemente. Aquí está el mensaje:
(binario a decimal) Escribe un método recursivo que analiza un número binario como una cadena en un entero decimal. El encabezado del método es:
public static String bin2Dec (String binaryString)
escriba un programa de prueba que le pida al usuario que ingrese una cadena binaria y muestre su equivalente decimal.
Cualquier ayuda muy apreciada. Aquí está mi código de la siguiente manera:
import java.util.Scanner;
public class HW04_P5 {
static int index = 0;
static int power = 0;
static int number = 0;
static boolean exit = false;
@SuppressWarnings("resource")
public static void main(String[] args){
Scanner scan = new Scanner(System.in);
System.out.print(" Enter a binary number to convert to decimal: ");
String in = scan.nextLine();
index = in.length()-1;
System.out.print(" Binary number converted to decimal: "+bin2Dec(in));
}
public static String bin2Dec(String in)
{
if((in.substring(index,index+1).equals("1"))&&(index>0))
{
number += Math.pow(2,power);
System.out.print(number);
power++;
index--;
bin2Dec(in);
}
else if((in.substring(index,index+1).equals("0"))&&(index>0))
{
power++;
index--;
bin2Dec(in);
}
System.out.print(number);
return "";
}
}
Es más limpio no tener el índice de variables extra, potencia y p. Simplemente procesa la cadena de derecha a izquierda. Tampoco quiere que se rastree el número variable "global" fuera de la función recursiva ... es confuso y extraño. Quiere que todo el estado sea llevado dentro de las funciones recursivas, en mi opinión. Incluso con esas restricciones, aún puede hacerlo en esencialmente dos líneas:
public static int bin2Dec(String s) {
if (s == null || s.isEmpty()) return 0;
else return s.charAt(s.length()-1)-48+2*bin2Dec(s.substring(0,s.length()-1));
}
Esa puede no ser la solución más clara, pero es la más elegante, creo. La claridad podría mejorarse rompiendo la cláusula else en varias líneas. 48 es el número de carácter Unicode para 0, que quizás no sea la mejor manera de convertir los caracteres ''0'' y ''1'' a sus respectivos números.
Primero, defina una versión private
que también tome una posición como
private static int bin2Dec(String in, int p) {
if (in == null || in.isEmpty() || p >= in.length()) {
return 0;
}
int s = (in.charAt(p) == ''1'' ? 1 : 0) << in.length() - p - 1;
return s + bin2Dec(in, p + 1);
}
Tenga en cuenta que primero definimos una condición de detención, luego determinamos si el personaje en esa posición es un 1
y luego cambiamos a la izquierda por la longitud de la String
(menos esa posición y menos uno porque Java usa indexación basada en cero). Luego recurse agregando ese valor al valor de retorno. Finalmente, el método public
es solo
public static int bin2Dec(String in) {
return bin2Dec(in, 0);
}
Primero: está imprimiendo el número en la condición if
, eso también sin /n
. El resultado que obtendrá será número impreso en llamadas múltiples.
En segundo lugar, el index > 0
condición index > 0
debe ser index >= 0
; de lo contrario, perderá la prueba del 0 ° índice. Y esa condición debería ser antes de &&
, no después de ella.
En tercer lugar, devuelva el number
del método, en lugar de imprimirlo allí.
Aquí está el método modificado con los cambios anteriores:
public static String bin2Dec(String in) {
if ((index >= 0) && (in.substring(index, index + 1).equals("1"))) {
number += Math.pow(2, power);
power++;
index--;
bin2Dec(in);
} else if ((index >= 0) && (in.substring(index, index + 1).equals("0"))) {
power++;
index--;
bin2Dec(in);
}
return "" + number;
}
Sin embargo, todavía veo mucha duplicación allí. Puede utilizar String#charAt()
método String#charAt()
, en lugar de substring()
, ya que realmente está buscando un solo carácter. Aquí está la versión simplificada de su método:
public static String bin2Dec(String in) {
if (index < 0) {
return "" + number;
}
if (in.charAt(index) == ''1'') {
number += Math.pow(2, power);
}
power++;
index--;
return bin2Dec(in);
}