2

私はこのcharの配列を持っています:private char[] posibilities = { 'a', 'b', 'c' };

そして、それらの可能なすべての組み合わせが必要な場合は、次の3つのネストを作成しました。

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());
        }
    }
}

私の質問は次のとおりです。ネストされたforにforを追加せずに、配列にcharを追加したい場合、どうすればよいですか?配列に20文字ある場合、20文字を実行できないと想像してください。それともそれが唯一の方法ですか。

(ちなみに、私は3ヶ月前からこれを解決しようとしていますが、それでも解決できません)

4

2 に答える 2

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をグローバルに表示できない場合は、この関数の3番目のパラメーターとしてlistBox1を渡すことができます。

ただし、多数の場合は注意してください。このリストは非常に速く成長します))

于 2012-11-29T20:19:39.900 に答える
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()));
}
于 2012-11-29T20:27:36.740 に答える