排列....或类似的

时间:2012-11-29 20:06:32

标签: c# loops permutation combinations nested

我有这个char数组:private char[] posibilities = { 'a', 'b', 'c' };

我想要所有可能的组合,然后我做了三个嵌套:

for (int cont = 0; cont < posibilities.Length; cont++)
{
    for (int i = 0; i < posibilities.Length; i++)
    {
        for (int j = 0; j < posibilities.Length; j++)
        {
            listBox1.Items.Add(posibilities[cont].ToString() + posibilities[i].ToString() + posibilities[j].ToString());
        }
    }
}

我的问题是:如果我想在我的数组中添加更多字符而不向嵌套中添加更多字符,我该怎么办?想象一下,如果我在阵列上有20个字符,我就不能做20个......或者那是唯一的方法吗?

(顺便说一句,我从3个月前开始尝试解决这个问题,但我还是不能)

2 个答案:

答案 0 :(得分:1)

尝试这种递归方法:

void RecursiveApproach(char[] possibilities, string cur)
{
    if (cur.Length == c.Length)
    {
        listBox1.Items.Add(cur);
        return;
    }
    for (int i = 0; i < possibilities.Length; i++)
    {
        RecursiveApproach(possibilities, cur + possibilities[i]);
    }
}

// Usage
RecursiveApproach(possibilities, "");

如果无法使全局可见,则可以将listBox1作为第三个参数传递给此函数。

但要注意大数字,这个列表会非常快速地增长))

答案 1 :(得分:0)

public static IEnumerable<IEnumerable<T>> PermutationsWithRepitition<T>(IList<T> source)
{
    return PermutationsWithRepitition(source, source.Count);
}

//private recursive method that does all of the work.
private static IEnumerable<IEnumerable<T>> PermutationsWithRepitition<T>(IList<T> source, int resultSize)
{
    if (resultSize == 1)
        return source.Select(item => new[] { item });
    else
    {
        return PermutationsWithRepitition(source, resultSize - 1)
            .SelectMany(permutation => source.Select(item => new[]{item}.Concat(permutation)));
    }
}

示例用法:

char[] posibilities = new[] { 'a', 'b', 'c' };

foreach (var permutation in PermutationsWithRepitition(posibilities))
{
    Console.WriteLine(new string(permutation.ToArray()));
}