实现递归方法,使它返回数N的二进制表示中的1的个数。(如果N是奇数,那么N的二进制表示中的1的个数为N/2的二进制表示的1的个数加1)。实现见文章最后。
数据结构和算法(Java语言描述)的第一章课后题。
先简化思路,可以先用递归实现数N的二进制表示,先用字符串类型,再用String进行字符对比获取二进制表示中1的个数。
根据数N的获取二进制表示的算法(除2取余,并将余数倒序排列)实现二进制表示的代码。
递归实现二级制表示的方法:
// 将传入的十进制数转化为二进制数(二进制数实际上表示为字符串)
public static String toBinary(int i) {
// 如果输入是0 直接返回0
if (i == 0) {
return "0";
}
if (i == 1) {
return "1";
}
String a = "";
if (i % 2 == 1) {
a = "1";
}
if (i % 2 == 0) {
a = "0";
}
return toBinary(i / 2) + a;
}
方法已经实现大于等于0的任意数的二进制表示,返回值类型为String,当然,可以使用Integer.parseInt的方法来转换成int类型。
main方法测试:
public static void main(String[] args) {
System.out.println((toBinary(45)));
}
输出结果为101101 ,是45的二进制表示。正确。
这里已经获得了数N的二进制表示 ,可以继续从二进制表示的String中获取指定字符1的个数。
从指定字符串获取指定字符个数的方法:
// 从二进制数据中获取指定0或1的个数
public static int getNumFromString(char a, String binary) {
char[] charArray = binary.toCharArray();
int num = 0;
for (int i = 0; i < charArray.length; i++) {
if (a == charArray[i]) {
num++;
}
}
return num;
}
main方法测试:
public static void main(String[] args) {
System.out.println((toBinary(45)));
System.out.println(getNumFromString('1', toBinary(45)));
}
输出101101 4
45的二进制表示为101101,包含4个1。正确。
实现递归方法,使它返回数N的二进制表示中的1的个数
根据除2取余的思路,如果余数为1,则记录1的个数的变量加1,然后商数继续除2取余,直到商变成1。
递归实现代码:
static int index = 0;
public static int toBinary(int i) {
// 如果仅仅是0 直接返回0
if (i == 0) {
return 0;
}
if (i == 1) {
index++;
} else {
if (i % 2 == 1) {
index++;
}
}
toBinary(i / 2);
return index;
}
验证:binary(45)结果为4,binary(9)结果为2,binary(110)结果为5。(binary(110)二进制表示为1101110)