C 二进制数的递归打印
我正在努力编写一种递归方法来打印二进制数。以下是我到目前为止的情况:C 二进制数的递归打印,c,recursion,C,Recursion,我正在努力编写一种递归方法来打印二进制数。以下是我到目前为止的情况: int bin(unsigned char n) { if (n==0) { return 0; } else { printf("%d", bin(n<<1)); } } bin(7) int-bin(无符号字符n) { 如果(n==0){ 返回0; }否则{ printf(“%d”),bin(n在n为0时停止是错误的 对于n以0开头
int bin(unsigned char n)
{
if (n==0) {
return 0;
} else {
printf("%d", bin(n<<1));
}
}
bin(7)
int-bin(无符号字符n)
{
如果(n==0){
返回0;
}否则{
printf(“%d”),bin(n在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;
}
#包括
无效的
bin2(无符号字符n,整数shf)
{
如果(shf>shf)&1);
}
}
无效的
bin(无符号字符n)
{
bin2(n,0);
}
int
主(空)
{
for(unsigned int chr=0;chr在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;
}
#包括
无效的
bin2(无符号字符n,整数shf)
{
如果(shf>shf)&1);
}
}
无效的
bin(无符号字符n)
{
bin2(n,0);
}
int
主(空)
{
对于(unsigned int chr=0;chr一些错误,例如使用
(shift-down)。也不总是返回某些内容。我很惊讶编译器没有在这一点上向上拉您。您不会从返回值中获得任何东西,因此您最好将其删除
一个简单的实现可能是这样的。我们需要使用包装函数(bin\u 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("0\n");
} else
{
bin_recur(n);
printf("\n");
}
}
int main()
{
for(unsigned i = 0; i < 10; i++)
{
bin(i);
}
}
#包括
void bin_recur(未签名字符n)
{
如果(n>0)
{
printf(“%d”,n&1);
重复发生(n>>1);
}
}
void bin(未签名字符n)
{
如果(n==0)
{
printf(“0\n”);
}否则
{
本周复发(n);
printf(“\n”);
}
}
int main()
{
for(无符号i=0;i<10;i++)
{
bin(i);
}
}
您的bin
函数调用printf
这一事实并不完全理想。这就是我们所知道的,如果不限制函数的显示方式,该函数可以更易于重用。也许复制到字符串是一种好方法,甚至可以使用fprinf
打印到文件。一些错误,例如使用
(shift down)。也不总是返回某些内容。我很惊讶编译器没有在这一点上启动您。您不会从返回值中获得任何东西,因此您最好将其丢弃
一个简单的实现可能是这样的。我们需要使用包装函数(bin\u 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("0\n");
} else
{
bin_recur(n);
printf("\n");
}
}
int main()
{
for(unsigned i = 0; i < 10; i++)
{
bin(i);
}
}
#包括
void bin_recur(未签名字符n)
{
如果(n>0)
{
printf(“%d”,n&1);
重复发生(n>>1);
}
}
void bin(未签名字符n)
{
如果(n==0)
{
printf(“0\n”);
}否则
{
本周复发(n);
printf(“\n”);
}
}
int main()
{
for(无符号i=0;i<10;i++)
{
bin(i);
}
}
您的bin
函数调用printf
这一事实并不完全理想。这就是我们所知道的,如果函数不受其显示方式的限制,它可以更易于重用。也许复制到字符串是一种好方法,甚至可以使用fprinf
打印到文件。请将这一行添加到您的代码中
void binary(int n) {
if(n==0)
return;
binary(n/2);
printf("%d",n%2);
}
请将此行添加到代码中
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
}
}
链接到正在运行的代码。您需要在递归函数之后执行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
}
}
链接到正在运行的代码。Withbin(0)
它不会打印任何东西。我希望打印二进制数的方法会产生“0”
。节省时间并启用所有警告。carl.hiass,当n==0
为false时,int-bin()
在哪里返回值?Withbin(0)
它什么也不打印。我希望打印二进制数的方法会产生“0”
。节省时间并启用所有警告。carl.hiass,当n==0
为false时,int bin()
在哪里返回值?或者您可以添加二进制(n>>1)以2除法。先生,语言没有问题。或者您可以添加二进制(n>>1)先生,用2除法,语言不是问题。