为什么此代码终止并崩溃以评估位数?
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;
}
答案 0 :(得分:2)
递归函数通过将问题分解为更小的部分来工作。看起来您正在尝试通过将问题除以2来将问题分解为更小的部分。这可以起作用,但是您必须牢记两点:
您必须计算两个部分的位数。例如,如果您致电bitCount(val/2)
,那很好:您刚刚在一个较小的问题上呼叫了bitCount()
,除了val
的最后一位以外,其他所有问题都被呼叫了。但是,您刚刚扔掉的最后一点呢?如果它是1,则必须计数。(提示:val%2
)。
您不能永远进行递归调用。在这种情况下:如果val
小于2,则val/2
将为0,因此其中没有1位,因此无需调用bitCount(val/2)
即可发现。因此,在这种情况下,您需要不调用bitCount
来“破坏递归”。
就像我说的那样,这是可行的,但是它并不是递归函数的一个很好的例子,因为“将其分解成较小的部分”相当不平衡。该算法将进行递归调用,其数量与位数相同。最后,它的时间复杂度与简单的线性算法大致相同(“大O”)。理想情况下,您可以根据位数而不是根据位数将数字分为两半。
换句话说,在您的示例中,二进制为94的1011110
是您将其分解为两个子问题101111
和0
的一个子问题。最好将其分为1011
和110
。
我不知道这样做的简单方法;以这种方式将数字一分为二可能与最初计算位数一样困难,因此几乎没有优势。另一种可能性是,通过调用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。我希望那是您想要的:)