十进制转二进制递归函数输出结果反转问题求助
解决递归十进制转二进制输出反转的问题
嘿,我一眼就看出问题出在哪啦!你的递归逻辑顺序搞反了,导致余数的填充方向和二进制位的顺序不匹配,咱们一步步来解决~
问题根源分析
你现在的代码是先计算当前数的余数(这是二进制的最低位),再递归处理商,而且把余数放到了数组的左侧(从array.length - bits的位置开始)。比如输入28时,第一次得到的余数是0(28%2),被放到了数组的最左边,最后递归到高位时的余数1被放到了数组的右侧,自然整个结果就反转了。
举个小例子:28的二进制是11100,你的代码会把余数的顺序(0,0,1,1,1)从左到右填充,加上补的0就变成了0011100000,完全反过来啦!
修复方案:调整递归与填充的顺序
正确的思路应该是先递归处理商(也就是更高位的二进制),再填充当前的余数,同时从数组的**右侧(末尾)**开始往左填充,这样高位的余数会先被放到数组的左边区域,低位的余数放到右边,正好符合二进制的顺序。
修改后的代码如下:
public void binary(int n, char[] array, int index) { if (0 == n) { // 递归到n=0时,把剩余的高位全部补0 while (index >= 0) { array[index--] = '0'; } return; } // 先递归处理商,往数组左侧移动一位(index-1) binary(n / 2, array, index - 1); // 再把当前余数填充到当前index的位置 array[index] = (n % 2 == 0) ? '0' : '1'; }
调用方式
比如你需要10位的二进制结果,这样调用:
char[] result = new char[10]; binary(28, result, 9); // 初始index设为数组最后一位的索引(9) System.out.println(new String(result)); // 输出:0000011100
为什么这样能行?
咱们走一遍28的递归流程:
- 从
binary(28, result,9)开始,先递归调用binary(14, result,8),直到binary(0, result,4) - 当n=0时,把index4到0的位置全部补0,得到数组前5位是
00000 - 然后回溯递归:
- 回到
binary(1, result,5),把1%2=1放到index5 → 数组第6位是1 - 回到
binary(3, result,6),把3%2=1放到index6 → 数组第7位是1 - 回到
binary(7, result,7),把7%2=1放到index7 → 数组第8位是1 - 回到
binary(14, result,8),把14%2=0放到index8 → 数组第9位是0 - 回到
binary(28, result,9),把28%2=0放到index9 → 数组第10位是0
最终数组就是0000011100,完全正确!
- 回到
内容的提问来源于stack exchange,提问作者Patrick
相关产品推荐
相关产品推荐

