递归函数求二进制中1的个数

问题遇到的现象和发生背景

写一个函数求一个整数的二进制有几个1,我尝试用递归实现,但是结果总是多1

int NumberOf1(int n)
{
    if (0 != n)
    {
        if (1 == n % 2)
        {
            return 1 + NumberOf1(n / 2);
        }
        else if (0 == n % 2)
        {
            return NumberOf1(n / 2);
        }
    }
}

int main()
{
    int n = 10;
    printf("%d\n", NumberOf1(n));

    return 0;
}
运行结果及报错内容

img

递归函数最后加一句return 0;

int NumberOf1(int n)
{
    if (0 != n)
    {
        if (1 == n % 2)
        {
            return 1 + NumberOf1(n / 2);
        }
        else if (0 == n % 2)
        {
            return NumberOf1(n / 2);
        }
    }
    return 0;
}
 
int main()
{
    int n = 10;
    printf("%d\n", NumberOf1(n));
 
    return 0;
}


int NumberOf1(int n)
{
    if (0 == n)
        return 0;

    return (n % 2) + NumberOf1(n / 2);
}

子函数的返回的情况没写完。你在vs下编译的话,应该会有警告,说不是所有的返回路径什么的。
所以你if外部要来一个return 0
把所有的返回情况写进去

NumberOf1 这个函数这样写:


int NumberOf1(int n)
{
    if (0 == n)
        return 0;

    if (1 == n % 2)
        return 1 + NumberOf1(n / 2);
    else
        return NumberOf1(n / 2);
}