带有重复的组合C#

本文关键字:组合 | 更新日期: 2023-09-27 18:21:55

我需要重复组合方面的帮助。我在网上搜索了很多,虽然我找到了一些例子,但我不能完全理解。我的目标很简单,一个函数(CombinationsWithRepetiion)接收包含项(在本例中为整数值)和长度(表示每个组合的长度)的列表,并返回包含结果的列表。

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

结果:

长度=1:1,2,3

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

长度=3:1111112。。。。

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

带有重复的组合C#

递归

好的,

这是C#版本-我带你浏览

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

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

在任何其他情况下,您都可以查看每个输入i,并递归使用下一个较小的组合,然后将它们插在一起(使用字符串连接,因为我想要字符串)。

我希望你能理解IEnumerable/yield的内容——如果没有在评论中这样说,请。

以下是输出示例:

foreach (var c in CombinationsWithRepetition(new int[]{1,2,3}, 3))
    Console.WriteLine (c);
111
112
113
...
332
333

转换数字

以下使用了我在下面评论中概述的想法,并且在堆栈溢出异常方面没有问题(递归可能适用于大长度)-这也假设字符串更容易处理(我可以做一个简单的PadLeft来简化事情)

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> CombinationsWithRepetition(string symbols, int len)
{
    for (var i = 0; i < Math.Pow(symbols.Length,len); i++)
        yield return Convert (symbols, i, len);
}
 string[] items = {"1", "2", "3"};
var query = from i1 in items
            from i2 in items
            from i3 in items
            select i1 + i2 + i3 ;

foreach(var result in query)
    Console.WriteLine(result);
            Console.ReadKey();