我是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 回答
你的函数返回一个字符串,但是你要求用户为你提供一个初始化的字符串,然后抛弃返回值,除了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 参数工作...但随后退出你的其他分支返回值,因为你不使用它们 .
这会让你感动吗?