我正在努力写一个递归的方式来打印二进制数。以下是目前为止的内容:
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
}
}
在这里链接到运行代码。