【问题标题】:Binary to decimal in java using only recursion (no loops)java中的二进制到十进制仅使用递归(无循环)
【发布时间】:2022-02-11 15:15:30
【问题描述】:

我似乎无法正确地将二进制数转换为十进制数。我相信我真的很接近,实际上我想使用一个字符串来保存二进制数来保存它,然后重新编写我的方法以仅使用 .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);

    }
}

【问题讨论】:

  • 我认为这一定是一项家庭作业,因为 java.lang.Integer 中内置了一个方法可以为您完成这项工作。我/我们可以告诉你答案,但是你会学到什么?
  • 我已经解释过我知道我需要做什么——我只是不知道这样做的语法或设置。我正在寻求帮助
  • 拒绝使用字符串会使事情变得更加困难。通常,通过使用 binary%10 并获取个位数,然后乘以 2^size,您正在反转数字。
  • 我如何实现字符串呢?我知道我需要这样做,但我不知道怎么做
  • 输入一个字符串并使用 scan.next() 考虑“1010”,当字符串为空时结束递归。 input.charAt(0) 是第一个字符(在这种情况下是一个)。 input.length() 是字符数(您当前的大小), input.substring(1) 将返回“010”或位置 0 处字符之后的所有内容。

标签: java recursion


【解决方案1】:

这是一个改进的版本

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);     
  }
}

【讨论】:

  • 请告诉我它有帮助。
  • 这帮助很大!最后一部分我不得不改变一点,但你帮我明白了!我将您的第二种方法与此方法下方的评论混合在一起-谢谢!
  • 现在当你完成你的任务后,很高兴知道有用于这种转换的内置解决方案。特别是 Integer.parseInt(binInput, 2) 将与您的 binToDecimal 方法相同。
【解决方案2】:

不要以相反的顺序解析二进制文件。
这里调用binaryToDecimal(int)会返回十进制数。

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 的形式传递二进制数。

【讨论】:

    【解决方案3】:

    如果您希望使用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 个字符长,或者您的递归工作已经结束,您将只返回该号码。例如,二进制的1 是十进制的1,所以它会返回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 添加到运行总数中。

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

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

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

    【讨论】:

      【解决方案4】:

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

      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 的原因是静态字段需要重置。

      【讨论】:

        【解决方案5】:

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

        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));
            }
        
        }
        

        }

        【讨论】:

          猜你喜欢
          • 2015-01-15
          • 1970-01-01
          • 1970-01-01
          • 2016-05-03
          • 2014-12-05
          • 1970-01-01
          • 1970-01-01
          • 2012-04-19
          • 2022-11-14
          相关资源
          最近更新 更多