与重复C#的组合

问题描述 投票:4回答:2

我需要帮助组合重复。已经在网上搜索过,虽然我发现了一些例子但我完全无法理解它们。我的目标很简单,一个函数(CombinationsWithRepetiion)接收包含项目的列表(在本例中为整数值)和length(表示每个组合可以有多长)并返回包含结果的列表。

    List<int> input = new List<int>() {1, 2, 3}
    CombinationsWithRepetition(input, length);

结果:

长度= 1:1,2,3

长度= 2:11,12,13,21,22,23,31,32,33

长度= 3:111,112 ....

我希望有人帮助我,并提前感谢你!

c# combinations repeat
2个回答
11
投票

递归

好,

这是C#版本 - 我引导你完成它

static IEnumerable<String> CombinationsWithRepition(IEnumerable<int> input, int length)
{
    if (length <= 0)
        yield return "";
    else
    {
        foreach(var i in input)
            foreach(var c in CombinationsWithRepition(input, length-1))
                yield return i.ToString() + c;
    }
}

首先你检查递归的边界情况(在这种情况下,如果length <= 0) - 在这种情况下答案是空字符串(顺便说一句:我选择返回字符串,因为你没有说你真正需要的 - 应该很容易改变)。

在任何其他情况下,你看看每个输入qazxsw poi并递归地采用下一个较小的组合,然后将em连接在一起(使用String-concatination因为我想要字符串)。

我希望你理解i / IEnumerable的东西 - 如果在评论中不这么说请。

这是一个示例输出:

yield

转换数字

下面使用我在下面的注释中概述的想法,并且没有堆栈溢出异常的问题(递归可能适用于大长度) - 这也假设字符串,因为它们更容易使用(我可以做一个简单的foreach (var c in CombinationsWithRepition(new int[]{1,2,3}, 3)) Console.WriteLine (c); 111 112 113 ... 332 333 来简化事情)

PadLeft

0
投票
static String Convert(string symbols, int number, int totalLen)
{
    var result = "";
    var len = symbols.Length;
    var nullSym = symbols [0];
    while (number > 0)
    {
        var index = number % len;
        number = number / len;
        result = symbols [index] + result;
    }
    return result.PadLeft (totalLen, nullSym);
}

static IEnumerable<String> CombinationsWithRepition(string symbols, int len)
{
    for (var i = 0; i < Math.Pow(symbols.Length,len); i++)
        yield return Convert (symbols, i, len);
}
© www.soinside.com 2019 - 2024. All rights reserved.