递归二进制转换C.

我是C的新手 . 我正在尝试编写递归二进制函数 . 二进制输出需要是4位,因此逻辑大约为15,二进制字符串长度 . 它正确地转换为二进制,我遇到的问题是结束递归调用并将二进制字符串返回到main函数 . 它似乎只是向后通过调用堆栈?有人可以帮我理解发生了什么吗?

假设使用命名空间std . 我知道这不是一个好习惯,但是我的课程是必需的 .

string binary(int number, string b){
    if (number > 0 && number < 15){
        int temp;
        temp = number % 2;
        b = to_string(temp) + b;
        number = number / 2;
        binary(number, b);
    }
    else if (number > 15){
        b = "1111";
        number = number - 15;
        binary(number, b);
    }
    else if (number == 15){
        b = "11110000";
        return b;
    }
    //should be if number < 1
    else{
        int s = b.size();
        //check to make sure the binary string is 4 bits or more
        if (s >= 4){
            return b;
        }
        else{
            for (int i = s; i < 4; i++){
                b = '0' + b;
            }
            return b;
        }

    }
}

回答(1)

3 years ago

你的函数返回一个字符串,但是你要求用户为你提供一个初始化的字符串,然后抛弃返回值,除了15和0的基本情况 . 其余的时间,你的实际通信正在使用参数 b . 这种多重沟通会引起一些麻烦 .

我还注意到,在正常情况下,您返回正确填充的4位数字;但是,强制返回一个8位 15 的精确值15.这是赋值规范的一部分吗?

较大数字的逻辑很奇怪:如果数量超过15,则返回附加到余数的表示的"1111" . 例如,20将返回二进制(5),然后返回"1111"或"1011111",这显然是错误的 . 更奇怪的是,似乎15的任何倍数都将返回"11110000",因为该子句(== 15)会覆盖 b 的任何先前值 .

我建议你分析并简化逻辑 . 应该有两种情况:

  • (BASE)如果number == 0,则返回'0'

  • (RECUR)返回['1'(对于奇数)否则'0']二进制(数字/ 2)

您还需要一个顶级包装器来检查字符串长度,如果需要,填充为4位数 . 如果"wrapper"逻辑不适合您的设计理念,然后将其删除,只与 b 参数工作...但随后退出你的其他分支返回值,因为你不使用它们 .

这会让你感动吗?