java 中的二进制到十进制仅使用递归(无循环)

Binary to decimal in java using only recursion (no loops)

我似乎无法找到将二进制数正确转换为十进制数的方法。我相信我真的很接近,事实上我想用一个字符串来保存二进制数来保存它,然后重写我的方法来只使用 .length 来获取大小但我不知道该怎么做.有人能帮我弄清楚如何使用字符串重写代码来保存二进制值,然后只使用递归而不使用循环来获取十进制值吗?

这是我现在的完整代码,我不会摆脱询问二进制文件的大小并使用字符串自己计算出来的问题。请帮助:)

package hw_1;
import java.util.Scanner;


public class Hw_1 {

    public static void main(String[] args) {

        int input;
        int size;
        Scanner scan = new Scanner(System.in);

        System.out.print("Enter decimal integer: ");
        input = scan.nextInt();
        convert(input);
        System.out.println();
        System.out.print("Enter binary integer and size : ");
        input = scan.nextInt();
        size = scan.nextInt();
        System.out.println(binaryToDecimal(input, size));

    }

    public static void convert(int num) {
        if (num > 0) {
            convert(num / 2);
            System.out.print(num % 2 + " ");
        }
    }

    public static int binaryToDecimal(int binary, int size) {
        if (binary == 0) {
            return 0;
        }
        return binary % 10
                * (int) Math.pow(2, size) + binaryToDecimal((int) binary / 10, size - 1);

    }
}

不要以相反的顺序解析二进制文件。
这里通过调用 binaryToDecimal(int) 它将 return 十进制数。

public static int binaryToDecimal(int binary) {
    return binaryToDecimal(binary, 0);
}

public static int binaryToDecimal(int binary, int k) {
    if (binary == 0) {
        return 0;
    }
    return (int) (binary % 10 * Math.pow(2, k) + binaryToDecimal(binary / 10, k + 1));
}

如果您编码只是为了转换数字(不是为了练习)。那么更好的方法是使用 Integer.parseInt(String, 2)。在这里你必须以 String.

的形式传递二进制数

如果您希望使用 String 来保存二进制表示,您可以使用以下内容:

public static int binaryToDecimal(String binaryString) {

    int size = binaryString.length();
    if (size == 1) {
        return Integer.parseInt(binaryString);
    } else {
        return binaryToDecimal(binaryString.substring(1, size)) + Integer.parseInt(binaryString.substring(0, 1)) * (int) Math.pow(2, size - 1);
    }

}

这是如何工作的,具有以下逻辑。如果,您发送给它的数字只有 1 个字符长,或者您到达递归工作的结尾,您将 return 只是那个数字。因此,例如,二进制的 1 是十进制的 1,因此它将 return 1。就是这样

if (size == 1) {
        return Integer.parseInt(binaryString);
}

有。第二部分(也是更重要的部分)可以分为两部分。 binaryString.substring(1, size)Integer.parseInt(binaryString.substring(0, 1)) * (int) Math.pow(2, size - 1)。 return 语句中对

的调用
binaryString.substring(1, size)

是为了把二进制数的第一个数全部传回函数进行计算。因此,例如,如果您有 11001,在第一个循环中它会砍掉第一个 1 并使用 1001 再次调用该函数。第二部分,将二进制表示头部位置编号的值添加到总值中。

Integer.parseInt(binaryString.substring(0, 1))

获取当前字符串中的第一个数字,

* (int) Math.pow(2, size - 1)

是说 Multiple that by 2 to the power of x, where x is the position that the number is in。因此,再次使用我们的 11001 示例,第一个数字 1 在二进制表示中位于 4 位置,因此它将 1 * 2^4 添加到 运行 总数.

如果你需要一个方法来测试这个,我用一个简单的主要方法验证了它:

public static void main(String args[]) {
    String binValue = "11001";
    System.out.println(binaryToDecimal(binValue));
}

希望这对您有意义。如果您需要更多帮助,请随时提出问题。

这是一个改进的版本

package hw_1;
import java.util.Scanner;

public class Hw_1 {
  public static void main(String[] args) {

    Scanner scan = new Scanner(System.in);
    System.out.print("Enter decimal integer : ");
    int input = scan.nextInt();
    convert(input);
    System.out.println();
    System.out.print("Enter binary integer : ");
    String binInput = scan.next();
    System.out.println(binaryToDecimal(binInput));
  }

  public static void convert(int num) {
    if (num>0) {
      convert(num/2);
      System.out.print(num%2 + " ");
    }
  }

  public static int binaryToDecimal(String binInput){  
    int len = binInput.length();
    if (len == 0) return 0;
    String now = binInput.substring(0,1);
    String later = binInput.substring(1);
    return Integer.parseInt(now) * (int)Math.pow(2, len-1) + binaryToDecimal(later);     
  }
}

这是简洁明了的递归算法;但是,您需要跟踪一些全局变量以获得电源,我已将其定义为静态成员。

static int pow = 0;

public static int binaryToDecimal(int binary) {
    if (binary <= 1) {
        int tmp = pow;
        pow = 0;
        return binary * (int) Math.pow(2, tmp);
    } else {
        return ((binary % 10) * (int) Math.pow(2, pow++)) + binaryToDecimal(binary / 10);
    }
}

注意:我引入pow的原因是静态字段需要重置。

刚刚对您的代码进行了必要的更改。 这样,您就不需要用户输入尺寸。 并且十进制转二进制和二进制转十进制都可以成功

package hw_1;
import java.util.Scanner;
public class Hw_1 {
public static void main(String[] args) {

    int input;
    int size;
    Scanner scan = new Scanner(System.in);

    System.out.print("Enter decimal integer: ");
    input = scan.nextInt();
    convert(input);
    System.out.println();
    System.out.print("Enter binary integer : ");
    input = scan.nextInt();
    System.out.println(binaryToDecimal(input));

}

public static void convert(int num) {
    if (num > 0) {
        convert(num / 2);
        System.out.print(num % 2 + " ");
    }
    return -1;
}
public static int binaryToDecimal(int binary) {
    if(binary==0)
    {
        return 0;
    }
    else
    {
        String n=Integer.toString(binary);
        int size=(n.length())-1;
        int k=(binary%10)*(int)(Math.pow(2,size));
        return k + binaryToDecimal(((int)binary/10));
    }

}

}