[英]Using recursion how can I count number of bits in an unsigned integer?
為什么此代碼終止並崩潰以評估位數?
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來將問題分解為更小的部分。這可以起作用,但是您必須牢記兩點:
您必須計算兩個部分的位數。 例如,如果您調用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和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。我希望這是您想要的:)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.