1

多くの関数を使用する代わりに、1つの関数を使用してこれを機能させるのに問題があります。

2^3のような繰り返しで順列を取得したい場合。 繰り返しのある順列

取得するため:

000
001
101
011
100
101
110
111

私はこの機能を持つことができます:

   static void Main(string[] args)
    {
        three_permutations(2);
        Console.ReadLine();
    }


    static void three_permutations(int y)
    {

        for (int aa = 0; aa < y; aa++)
        {
            for (int bb = 0; bb < y; bb++)
            {
                for (int cc = 0; cc < y; cc++)
                {
                    Console.Write((aa));
                    Console.Write((bb));
                    Console.Write((cc));
                    Console.WriteLine();
                }
            }
        }

    }

しかし、4(2 ^ 4のように)を行うために、私が考えることができる唯一の方法はこれです:

  static void four_permutations(int y)
    {
            for (int aa = 0; aa < y; aa++)
            {
                for (int bb = 0; bb < y; bb++)
                {
                    for (int cc = 0; cc < y; cc++)
                    {
                        for (int dd = 0; dd < y; dd++)
                        {
                            Console.Write((aa));
                            Console.Write((bb));
                            Console.Write((cc));
                            Console.Write((dd));
                            Console.WriteLine();
                        }
                    }
                }
            }
     }

しかし、再帰を使用するより良い方法があると確信しています。それを行う方法がわかりません。助けていただければ幸いです。ありがとう。

4

3 に答える 3

5

繰り返しのある順列は、基本的に別のベースでカウントされます。

public static void Permutations(int digits, int options)
{
    double maxNumberDouble = Math.Ceiling(Math.Pow(options, digits));
    int maxNumber = (int)maxNumberDouble;
    for (int i = 0; i < maxNumber; i++)
    {
        Console.WriteLine(Convert.ToString(i, options).PadLeft(3, '0'));
    }
}

印刷した例は、基本的に2進数で0から8まで数えています。

于 2012-10-09T16:27:35.150 に答える
5
void permutations(string text, int numberOfDigits, int numberOfChars)
{
    if (numberOfDigits > 0)
        for (int j = 0; j < numberOfChars; j++)
            permutations(text + j.ToString(), numberOfDigits - 1, numberOfChars);
    else textBox1.Text += text + "\r\n";
}

と電話:

permutations("", 3, 2);
于 2012-10-09T16:29:56.317 に答える
0

再帰なしで、後で使用するためのリストに、10行未満で。

public IEnumerable<List<int>> YieldCombinationsOfN(int places, int digitMin, int digitMax)
{            
    int n = digitMax - digitMin + 1;
    int numericMax = (int)Math.Pow(n, places);

    for (int i = 0; i < numericMax; i++)
    {
        List<int> li = new List<int>(places);
        for(int digit = 0; digit < places; digit++)
        {
            li.Add(((int)(i / Math.Pow(n, digit)) % n) + digitMin);
        }
        yield return li;
    }
}
于 2017-07-28T18:12:22.180 に答える