通过递减一半生成细分

时间:2019-06-26 14:22:46

标签: c# series

我需要递归地将数字减半并细分。直到段的长度小于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();

还有更好的方法吗?

1 个答案:

答案 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部分。