递归二进制转换C ++

时间:2016-10-19 01:23:47

标签: c++ recursion binary

我是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 个答案:

答案 0 :(得分:0)

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

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

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

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

  • (BASE)如果number == 0,则返回&#39; 0&#39;
  • (RECUR)返回[&#39; 1&#39; (对于奇数)其他&#39; 0&#39;] +二进制(数字/ 2)

您还需要一个顶级包装器来检查字符串长度,如果需要,填充为4位数。如果&#34;包装&#34;逻辑不适合您的设计想法,然后放弃它,只使用 b 参数...但随后退出其他分支中的值,因为您不能使用它们。

这会让你感动吗?