递归实现数N的二进制表示

来源:互联网 发布:testflight软件下载 编辑:程序博客网 时间:2024/05/21 19:22

 实现递归方法,使它返回数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)

原创粉丝点击