我需要递归地将数字减半并细分。直到段的长度小于1;例如当数字为15时,我们将有:
0,15 ==> 1 segment, length = 15
0,7.5,15 ==> 2 segments, length = 7.5
0,3.75,7.5,11.25,15 ==> 4 segments, length = 3.75
0,1.875,3.75,5.625,7.5,9.375,11.25,13.125,15 ==> 8 segments, length = 1.875
0,0.9375,1.875, ..... ,13.125,14.0625,15 ==> 16 segments, length = 0.9375
到目前为止,我可以通过以下朴素代码来做到这一点:
double delta = N; //N being the input number
while(delta > 1.0)
delta /= 2.0;
int count = (N / delta) + 1;
var series = Enumerable.Range(0, count).Select(x => x * delta).ToArray();
还有更好的方法吗?
答案 0 :(得分:0)
使用以下方法为32位整数计算下一个最高幂2:
public int NextHighestPowerOf2(int n) {
// if n > 2^31 then fails - answer can't fit in int
if ((n & (n - 1)) == 0) // n is a power of 2
return n << 1;
else {
--n;
n |= n >> 1;
n |= n >> 2;
n |= n >> 4;
n |= n >> 8;
n |= n >> 16;
return n + 1;
}
}
您可以类似地计算series
:
var nhp2 = NextHighestPowerOf2(N);
var series = Enumerable.Range(0, nhp2+1).Select(n => (double)(n*N)/nhp2).ToArray();
注意::这与您的代码略有不同,它也将2的初始幂除。您的代码具有大小为1的段,初始幂为2。如果您想要代码,只需将方法更改为仅使用else
部分。