按照简单模式初始化N个数字数组的最简单方法是什么?

时间:2020-03-05 18:54:40  来源:igfitidea点击:

假设前N个整数可以从9开始被3整除。

我敢肯定,有一些使用lambda的解决方案,我只是不太了解该语言领域。

解决方案

回答

我不能说这有什么用,我不是Cexpert,我只是把它搞砸了,但是我认为这可能是使用yield的典型例子。

internal IEnumerable Answer(N)
{
  int n=0;
  int i=9;
  while (true)
  {
    if (i % 3 == 0)
    {
      n++;
      yield return i;
    }

    if (n>=N) return;
    i++;
  }
}

回答

我们必须遍历0或者1到N,然后手动添加它们。或者,我们可以只创建函数f(int n),然后在该函数中将结果缓存在会话或者全局哈希表或者字典中。

伪代码,其中ht是全局哈希表或者字典(强烈建议使用后者,因为它是强类型的。

public int f(int n)
{
  if(ht[n].containsValue)
    return ht[n];
  else
  {
    //do calculation
    ht[n] = result;
    return result;
   }
}

只是一个旁注。如果我们一直都在进行这种类型的功能编程,则可能需要检出F#,或者甚至是Iron Ruby或者Python。

回答

const int __N = 100;
const int __start = 9;
const int __divisibleBy = 3;

var array = Enumerable.Range(__start, __N * __divisibleBy).Where(x => x % __divisibleBy == 0).Take(__N).ToArray();

回答

使用Linq:

int[] numbers =
    Enumerable.Range(9,10000)
    .Where(x => x % 3 == 0)
    .Take(20)
    .ToArray();

如果需要,还可以使用PLinq轻松并行化:

int[] numbers =
    Enumerable.Range(9,10000)
    .AsParallel()             //added this line
    .Where(x => x % 3 == 0)
    .Take(20)
    .ToArray();

回答

int n = 10; // Take first 10 that meet criteria
int[] ia = Enumerable
              .Range(0,999)
              .Where(a => a % 3 == 0 && a.ToString()[0] == '9')
              .Take(n)
              .ToArray();

回答

我想看看这个解决方案如何与上述Linq解决方案相结合。这里的技巧是利用以下事实来修改谓词,即从(s)开始的({q%m)`的集合是((s +(s%m)+ m * n))(其中n代表in集合)。在我们的例子中,是s = q。

该解决方案的唯一问题是,它的副作用是使实现取决于我们选择的特定模式(并非所有模式都有合适的谓词)。但是它具有以下优点:

  • 始终在准确的n次迭代中运行
  • 永远不会像上述建议的解决方案那样失败(改写为有限的"范围")。

此外,无论我们选择哪种模式,都将始终需要修改谓词,因此我们可能还需要使其在数学上有效:

static int[] givemeN(int n)
{
    const int baseVal = 9;
    const int modVal = 3;

    int i = 0;
    return Array.ConvertAll<int, int>(
        new int[n],
        new Converter<int, int>(
            x => baseVal + (baseVal % modVal) + 
                ((i++) * modVal)
        ));
}

编辑:我只想说明我们如何将这种方法与delegate一起使用以改善代码重用:

static int[] givemeN(int n, Func<int, int> func)
{
    int i = 0;
    return Array.ConvertAll<int, int>(new int[n], new Converter<int, int>(a => func(i++)));
}

我们可以将其与givemeN(5,i => 9 + 3 * i)一起使用。再次注意,我修改了谓词,但是我们也可以使用最简单的模式来执行此操作。

回答

只是有所不同(并避免使用where语句),我们还可以这样做:

var numbers = Enumerable.Range(0, n).Select(i => i * 3 + 9);

更新这还有一个好处,就是数字不会用完。