如何在没有显式嵌套循环的情况下生成N个元素的组合,每个元素只有2个有限的供应

本文关键字:元素 组合 2个 嵌套循环 情况下 | 更新日期: 2023-09-27 18:13:00

如果N是固定的,比如N = 3,那么很容易,我可以使用深度为3的嵌套循环。例如

from i in Enumerable.Range(0, 2)
from j in Enumerable.Range(0, 2)
from k in Enumerable.Range(0, 2)
select new int[] { i, j, k };

如果N是一个变量呢?

如何在没有显式嵌套循环的情况下生成N个元素的组合,每个元素只有2个有限的供应

您需要的是某种数组'乘数器'。像这样:

private static IEnumerable<int[]> Multiply(IEnumerable<int[]> input,
    IEnumerable<int> multiplyers)
{
    foreach (var array in input)
    {
        foreach (var multiplyer in multiplyers)
        {
            yield return array.Concat(new int[] { multiplyer })
                .ToArray();
        }
    }
}

您可以像下面这样使用这个方法来获得与上面示例相同的结果:

int n = 3;
var multiplyers = Enumerable.Range(0, 2);
IEnumerable<int[]> results = 
    from m in multiplyers select new int[] { m };
while (n-- > 1)
{
    results = Multiply(results, multiplyers);
}

现在n是可变的