C语言 你好......为什么这个函数对n=0不起作用?

dfty9e19  于 2022-12-29  发布在  其他
关注(0)|答案(3)|浏览(167)

我必须用C写一个递归函数来把一个十进制数转换成二进制数。
这是我们得到的void dec_to_binary(int n)的原型。
我的代码:

void dec_to_binary(int n)
{
    // base case: if the number is 0, return
    if (n == 0)
    {
        return;
    }
    // recursive case: divide the number by 2 and call the function again
    dec_to_binary(n / 2);
    // print the remainder (which will be 0 or 1)
    printf("%d", n % 2);
}

为什么n为0时不起作用?

baubqpgj

baubqpgj1#

当input为0时,代码不会打印任何内容,因为它会立即返回。也许可以在调用函数之前检查input是否为0,如下所示:

void dec_to_binary_recursive(int n)
{
    // base case: if the number is 0, return
    if (n == 0)
    {
        return;
    }
    // recursive case: divide the number by 2 and call the function again
    dec_to_binary_recursive(n / 2);
    // print the remainder (which will be 0 or 1)
    printf("%d", n % 2);
}

void dec_to_binary(int n)
{
    if (n == 0)
    {
        printf("%d", 0);
    }
    else
    {
        dec_to_binary_recursive(n);
    }
}

请记住,它不支持负数,可能还有更好的方法

b4qexyjb

b4qexyjb2#

有可能实现一种不需要 Package 函数或第二个参数的方法。

void dec_to_binary(int n) {
    if ((unsigned int)n > 1)
        dec_to_binary((unsigned int)n/2);
    printf("%u", (unsigned int)n % 2);
}
uqxowvwt

uqxowvwt3#

如上所述,当前的dec_to_binary函数在输入为0时立即返回,不执行任何操作。
不需要添加函数就可以解决这个问题,
通过具有用于0和1的递归的基本情况:

#include <stdio.h>

void dec_to_binary(unsigned int n)
{
    // base case (0 or 1):
    if (n <= 1u)
    {
        printf("%u", n);
        return;
    }
    // recursive case:
    dec_to_binary(n / 2);
    printf("%u", n % 2);
}

int main()
{
    dec_to_binary(0);    printf("\n");
    dec_to_binary(1);    printf("\n");
    dec_to_binary(2);    printf("\n");
    dec_to_binary(7);    printf("\n");
}

输出:

0
1
10
111

请注意,此解决方案仅适用于非负值,因此我将输入类型更改为unsigned

相关问题