Java 正在将二进制数字字符串转换为十进制数。。。使用递归

Java 正在将二进制数字字符串转换为十进制数。。。使用递归,java,string,recursion,binary,decimal,Java,String,Recursion,Binary,Decimal,计算机科学教授在我们的家庭作业中给了我们这个问题。。。我不知道如何继续,我写的代码似乎失败得很惨。提示如下: (二进制到十进制)编写一个递归方法,将二进制数作为字符串解析为十进制整数。方法标题为: 公共静态字符串bin2Dec(字符串binaryString) 编写一个测试程序,提示用户输入二进制字符串,并显示其十进制等效值 非常感谢您的帮助。以下是我的代码: import java.util.Scanner; public class HW04_P5 { static int i

计算机科学教授在我们的家庭作业中给了我们这个问题。。。我不知道如何继续,我写的代码似乎失败得很惨。提示如下:


(二进制到十进制)编写一个递归方法,将二进制数作为字符串解析为十进制整数。方法标题为:

公共静态字符串bin2Dec(字符串binaryString)

编写一个测试程序,提示用户输入二进制字符串,并显示其十进制等效值


非常感谢您的帮助。以下是我的代码:

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

第一:您正在打印
if
条件下的数字,而不打印
\n
条件下的数字。您得到的输出将在多个调用中打印数字

其次,条件
index>0
应该是
index>=0
,否则将错过第0个索引的测试。并且该条件应该在
&&
之前,而不是之后

第三,从方法返回
number
,而不是在那里打印它

以下是经过上述修改的方法:

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;
}
然而,我仍然看到很多重复。您可以使用
String#charAt()
方法,而不是
substring()
,因为您实际上是在检查单个字符。以下是您的方法的简化版本:

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);
}
公共静态字符串bin2Dec(字符串输入){
如果(指数<0){
返回“”+编号;
}
如果(在字符(索引)='1'){
数字+=数学功率(2,功率);
}
power++;
索引--;
返回bin2Dec(in);
}

首先,定义一个
private
版本,该版本的位置如下

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

没有额外的变量索引、幂和p更干净。只需从右向左处理字符串。您也不希望在递归函数之外跟踪“全局”变量号。。。这很令人困惑和奇怪。在我看来,您希望所有状态都包含在递归函数中。即使有这些限制,您仍然可以通过两行代码来完成:

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

这也许不是最清晰的解决方案,但我认为这是最优雅的。将else子句分成几行可以提高清晰度。48是0的Unicode字符数,这可能不是将字符“0”和“1”转换为各自数字的最佳方式。

看起来您差不多做到了,但为了简化,我只需查看字符串的最后一位,然后将一个新字符串传递给
bin2Dec
,它是
字符串中
的子字符串。i、 e.不需要
索引
您得到了什么输出或错误?这非常有效。起初,我在理解这段代码时遇到了一些困难,但这对我理解如何压缩/压缩代码有很大帮助。再次感谢你的提示。
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));
}