C语言 二进制数的递归打印



我正在努力写一个递归的方式来打印二进制数。以下是目前为止的内容:

int bin(unsigned char n)
{
if (n==0) {
return 0;
} else {
printf("%d", bin(n<<1));
}
}
bin(7)

上面的逻辑似乎有什么问题?

一些错误,例如使用<<(上移)而不是>>(下移)。也不总是返回一些东西。我很惊讶编译器没有把你拉上来。你不会从返回值中获得任何东西,所以你最好把它去掉。

一个简单的实现可能是这样的。我们需要包装函数(bin_recur)来允许我们区分输入值0和表示停止递归时间的0。

#include <stdio.h>
void bin_recur(unsigned char n)
{
if (n > 0) 
{
printf("%d", n & 1);
bin_recur(n >> 1);
}
}
void bin(unsigned char n)
{
if (n == 0) 
{
printf("0n");
} else 
{
bin_recur(n);
printf("n");
}
}
int main()
{
for(unsigned i = 0; i < 10; i++)
{
bin(i);
}
}

您的bin函数调用printf的事实并不完全理想。这就是所谓的紧密耦合,如果函数不受其呈现方式的限制,它可以更好地重用。也许复制到字符串是一个好方法,甚至使用fprintf打印到文件。

n为0时停止是错误的。

对于n开始为0的平凡情况,此操作失败。

你真正需要做的是传递一个移位量作为第二个参数,并在8位之后停止。

使用带值的return只会碍事。

下面是一些带有完整诊断测试的重构代码:

#include <stdio.h>
void
bin2(unsigned char n,int shf)
{
if (shf <= 7) {
bin2(n,shf + 1);
printf("%d", (n >> shf) & 1);
}
}
void
bin(unsigned char n)
{
bin2(n,0);
}
int
main(void)
{
for (unsigned int chr = 0; chr <= 0xFF; ++chr) {
printf("%2.2X: ", chr);
bin((unsigned char) chr);
printf("n");
}
return 0;
}

请将这些行添加到您的代码中。

void binary(int n) {
if(n==0)
return;
binary(n/2);
printf("%d",n%2);
}

您需要在递归函数之后执行print调用才能正常工作。下面是一个例子:

void bin(unsigned char n)
{
if (n > 1) bin(n>>1);
putchar(n&1 ? '1' : '0');
}
int main(void)
{
for (unsigned char i = 255; i; i--) {
printf("%d --> ", i), bin(i);
getchar(); // inspect element if you want
}
}

在这里链接到运行代码。