递归实现二进制转整数代码求助:计算结果不符合预期
问题分析与修正
让我们一步步拆解你代码里的问题,这几个小细节导致了结果出错:
核心错误点
- 字符转数字的错误:
b.charAt(0)返回的是字符的ASCII码值,比如字符'1'对应的是49,而不是整数1。直接用这个值去计算肯定会导致结果爆炸,比如输入"101"时第一个字符'1'就用49去乘,结果自然不对。 - 权重计算错误:二进制的每一位权重是2的(当前位的位置次方),对于字符串长度为n的二进制数,第一位(最左边)的权重应该是
2^(n-1),而不是2^n。比如"101"的第一位是1,对应的权重是2(3-1)=4,而不是23=8。 - 终止条件错误:当字符串长度小于2时(也就是只剩最后一位字符),你返回了0,这会把最后一位的数值完全丢掉。正确的做法应该是返回最后一位字符对应的整数值。
修正后的代码
public static int binaryToInt(String b) { // 终止条件:只剩最后一位,返回对应的数字 if (b.length() == 1) { return b.charAt(0) - '0'; // 用字符减去'0'的ASCII值得到对应的整数 } // 第一位的数字 * 2^(长度-1) + 递归处理剩下的子串 return (b.charAt(0) - '0') * (int) Math.pow(2, b.length() - 1) + binaryToInt(b.substring(1)); }
修正说明
- 字符转整数:使用
b.charAt(0) - '0'是Java中把字符数字转成整数的常用技巧,因为字符'0'到'9'的ASCII码是连续递增的,减去'0'的ASCII值就能得到对应的0-9整数。 - 权重修正:将指数从
b.length()改为b.length() - 1,符合二进制数的位权规则——最左边的位是最高位,对应2的(长度-1)次方。 - 终止条件调整:当字符串长度为1时,直接返回该位的数值,确保最后一位的数值被正确计入结果。
测试输入"101"时,计算过程为:1*2^2 + 0*2^1 +1*2^0 =4+0+1=5,结果正确。
内容的提问来源于stack exchange,提问作者Chris
相关产品推荐
相关产品推荐

