编写一个递归方法,它返回数N的二进制表示中1的个数,利用这样的事实:如果N是奇数,那么其中1 的个数等于N/2的二进制标识中1的个数加1
题目如上:
根据书中的描述,递归的四个原则:
1:基准情形
2:不断推进
3:设计法则
4:合成效益法则
首先我们要找到基准,如果N是奇数的规则已经有了,那么N是偶数的时候有什么规律呢。
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 |
000 | 0001 | 0010 | 0011 | 0100 | 0101 | 0110 | 0111 | 1000 | 1001 | 1010 | 1011 | 1100 | 1101 |
基准:N=0是,0个,N=1是1个
推进规律:N是偶数时,1的个数等于N/2的数字二进制中1 的个数
N是奇数,那么其中1 的个数等于N/2的二进制标识中1的个数加1
程序如下:
public static int GetNCount(int n )
{
if (n == 0)
{
return 0;
}
else if (n == 1)
{
return 1;
}
else
{
if (n % 2 == 0)
{
return GetNCount(n / 2);
}
else
{
return GetNCount(n / 2)+1;
}
}
}