将二进制数字字符串转换为十进制数...使用递归
Converting String of binary digits to decimal number... using recursion
Comp sci 教授在我们的家庭作业中给了我们这个问题...我不确定如何继续,而且我编写的代码似乎失败得很惨。这是提示:
(二进制转十进制) 写一个递归方法,将二进制数作为字符串解析成十进制整数。方法头是:
public static String bin2Dec(String 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个索引的测试。那个条件应该在 &&
之前,而不是在它之后。
第三,return 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);
}
首先,定义一个 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);
}
注意,我们先定义一个停止条件,然后判断那个位置的字符是否是一个1
然后左移String
的长度(减去那个位置减一因为 Java 使用基于零的索引)。然后将该值递归添加到 return 值。最后,public
方法只是
public static int bin2Dec(String in) {
return bin2Dec(in, 0);
}
没有额外的变量 index、power 和 p 会更干净。只需从右到左处理字符串。您也不希望 "global" 变量号在递归函数之外被跟踪……这很混乱而且很奇怪。在我看来,你希望递归函数中包含所有状态。即使有这些限制,您仍然可以基本上用两行来完成:
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”转换为各自数字的最佳方式。
Comp sci 教授在我们的家庭作业中给了我们这个问题...我不确定如何继续,而且我编写的代码似乎失败得很惨。这是提示:
(二进制转十进制) 写一个递归方法,将二进制数作为字符串解析成十进制整数。方法头是:
public static String bin2Dec(String 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个索引的测试。那个条件应该在 &&
之前,而不是在它之后。
第三,return 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);
}
首先,定义一个 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);
}
注意,我们先定义一个停止条件,然后判断那个位置的字符是否是一个1
然后左移String
的长度(减去那个位置减一因为 Java 使用基于零的索引)。然后将该值递归添加到 return 值。最后,public
方法只是
public static int bin2Dec(String in) {
return bin2Dec(in, 0);
}
没有额外的变量 index、power 和 p 会更干净。只需从右到左处理字符串。您也不希望 "global" 变量号在递归函数之外被跟踪……这很混乱而且很奇怪。在我看来,你希望递归函数中包含所有状态。即使有这些限制,您仍然可以基本上用两行来完成:
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”转换为各自数字的最佳方式。