Ejemplos de recursividad. Pasar de Decimal a Binario de forma recursiva

Programa que lea un número entero entero mayor o igual que cero en base decimal y muestre su equivalente en binario de forma recursiva

El caso base se obtiene cuando el número es 0 ó 1. En ese caso el número binario equivalente es el mismo.

Si no, se hace una llamada recursiva al método, enviándole n/2.

Cuando en esas llamadas recursivas se envíe un 0 o un 1 se mostrará ese valor y  a continuación se ejecutará la instrucción System.out.print(n % 2); que imprimirá el resto de la división en cada momento de la ejecucicón.

Para entender mejor como se producen la secuencia de llamadas recursivas puedes ver de forma gráfica el cálculo del factorial en la imagen de esta página.

//Programa Java para pasar de decimal a binario de forma recursiva
//el programa lee un número entero y muestra su valor en binario
import java.util.Scanner;

public class DecimalABinarioRecursivo {

    public static void main(String[] args) {

        Scanner sc = new Scanner(System.in);
        int n;

        do {
            System.out.print("Introduzca numero >0: ");                                                           
            n = sc.nextInt();
        } while (n < 0);

        System.out.print("\nBinario: ");
        decBin(n);
    }

  
    //Método recursivo para pasar de decimal a binario
    public static void decBin(int n) {
        if (n < 2) {
            System.out.print(n);
        } else {
            decBin(n / 2);
            System.out.print(n % 2);
        }
    }
}



7 comentarios:

  1. Alguien me podría explicar cómo hace el programador para que no salga 000001 si ingreso 32? Noté que si invierto estas dos líneas del else: decBin(n / 2); System.out.print(n % 2); sale al revés de la respuesta correcta, es decir, "000001". Qué pasa ahí? Por que la inversión causa eso? Entiendo que lo correcto es 100000, sólo quiero saber cómo lo hizo

    ResponderEliminar
  2. EL resultado sale invertido porque primero mandas imprimir y luego llamas a la función. Las funciones recursivas son funciones que se llaman así mismas una y otra vez. La idea del algoritmo es llamarla varias veces hasta que se cumpla que "n" es menor a 2:

    if (n < 2) {
    System.out.print(n);
    return;
    }

    Una vez se cumpla esta condición, no se volverá a llamar a la función "decBin" y se ejecutaran todos los "System.out.print(n % 2)".(De menor a mayor)

    Si cambias el orden del print y el de la llamada a la función "decBin", el numero aparecerá invertido porque primero imprimirá el (n %2) y luego llamará a la función.

    ResponderEliminar
    Respuestas
    1. Muy interesante, entonces la clave esta en la manera en la que imprime todos los System.out.print, si es de "menor a mayor" se entiende el porque la respuesta se invierte, lo cual en este caso ayuda.

      Eliminar
  3. Y si quiero que convierta de Binario a decimal de forma recursiva como seria ?

    ResponderEliminar
  4. @Alf0516 Aquí te va un ejemplo en python:

    import sys
    import math

    def bin_to_dec(n, exp=0):
    if n < 10:
    return int(math.pow(2, exp))
    else:
    return bin_to_dec(n / 10, exp+1) + (int(math.pow(2, exp)) * (n % 10))

    if __name__ == "__main__":
    print(bin_to_dec(int(sys.argv[1])))

    ResponderEliminar
  5. Este comentario ha sido eliminado por el autor.

    ResponderEliminar
    Respuestas
    1. para que el valor de n sea positivo. No hace la conversión hasta que el valor obtenido sea mayor a cero.

      Eliminar