【问题标题】:Generate Segments by halving recursively通过递归减半生成分段
【发布时间】:2019-06-26 14:22:46
【问题描述】:

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

有没有更好的办法?

【问题讨论】:

  • 在什么意义上更好?
  • @500-InternalServerError 更好的算法。
  • “更好”太模糊了。您正在寻找什么样的改进,性能多功能性、风格(基于意见),......?
  • 我不明白递归在您的“递归”解决方案中的位置;你可以解释吗?这是一个迭代解决方案,而不是递归解决方案。
  • @EricLippert 或 Math.Log(N,2) 对于我们这些尚未使用 .Net Core 的人 :)

标签: c# series


【解决方案1】:

使用以下方法计算 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 部分。

【讨论】:

  • 您应该编辑原始答案,而不是发布新答案。
  • @Code-Apprentice 谢谢 - 我正在这样做,但当我在编辑模式下长时间坐在页面上时,显然 Stackoverlow 感到困惑。它都超时并发布了答案。我将删除另一个答案。
  • @NetMage:这些年来我发生了十几次,我从来不知道为什么!
猜你喜欢
  • 1970-01-01
  • 2021-03-27
  • 1970-01-01
  • 2021-10-07
  • 2013-10-20
  • 2016-11-06
  • 1970-01-01
  • 2010-11-19
  • 1970-01-01
相关资源
最近更新 更多