Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 二进制数的递归打印_C_Recursion - Fatal编程技术网

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
    }
}

链接到正在运行的代码。

With
bin(0)
它不会打印任何东西。我希望打印二进制数的方法会产生
“0”
。节省时间并启用所有警告。carl.hiass,当
n==0
为false时,
int-bin()
在哪里返回值?With
bin(0)
它什么也不打印。我希望打印二进制数的方法会产生
“0”
。节省时间并启用所有警告。carl.hiass,当
n==0
为false时,
int bin()
在哪里返回值?或者您可以添加二进制(n>>1)以2除法。先生,语言没有问题。或者您可以添加二进制(n>>1)先生,用2除法,语言不是问题。