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

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

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值