使用递归如何计算无符号整数中的位数?

时间:2018-06-30 10:46:12

标签: c recursion

为什么此代码终止并崩溃以评估位数?

int main(void)
{
    int y = 94;
    int m  = bitCount(y);


    printf("%d",m);
    return 0;
}

int bitCount(int val)
{
    int i = 0;
    if(!bitCount(val/2))
        i++;
    return i;
}

2 个答案:

答案 0 :(得分:2)

递归函数通过将问题分解为更小的部分来工作。看起来您正在尝试通过将问题除以2来将问题分解为更小的部分。这可以起作用,但是您必须牢记两点:

  1. 您必须计算两个部分的位数。例如,如果您致电bitCount(val/2),那很好:您刚刚在一个较小的问题上呼叫了bitCount(),除了val的最后一位以外,其他所有问题都被呼叫了。但是,您刚刚扔掉的最后一点呢?如果它是1,则必须计数。(提示:val%2)。

  2. 您不能永远进行递归调用。在这种情况下:如果val小于2,则val/2将为0,因此其中没有1位,因此无需调用bitCount(val/2)即可发现。因此,在这种情况下,您需要不调用bitCount来“破坏递归”。

就像我说的那样,这是可行的,但是它并不是递归函数的一个很好的例子,因为“将其分解成较小的部分”相当不平衡。该算法将进行递归调用,其数量与位数相同。最后,它的时间复杂度与简单的线性算法大致相同(“大O”)。理想情况下,您可以根据位数而不是根据位数将数字分为两半。

换句话说,在您的示例中,二进制为94的1011110是您将其分解为两个子问题1011110的一个子问题。最好将其分为1011110

我不知道这样做的简单方法;以这种方式将数字一分为二可能与最初计算位数一样困难,因此几乎没有优势。另一种可能性是,通过调用bitCount(val/16)(相当于bitCount(val>>4))来折断每个低4位。

答案 1 :(得分:1)

我做了一个简单的程序,您可以在其中计算很多位数,我假设您正在谈论1和0。如果没有,那我就傻了:P

使用递归的bitCount函数:

int bitCount(unsigned int x, int count) {       
    if (n==0) return count;
    if (n%2==1) bitCount(n/2,count+1);
    else bitCount(n/2,count);
}

调用main函数:

int main() {
   unsigned int x=94;
   int counting = 0;
   printf ("Result of bits: %d \n", bitCount(x,counting));

return 1;
}

使用unsigned int = 94时,它将返回5。我希望那是您想要的:)