0

生成する一連の数値があり、何らかのアルゴリズムを使用して生成したいと考えています (反復または再帰は問題ではありません)。

コンテキスト化: この数値は、リストのリストを反復するためのインデックスです。順列(組み合わせ、正確にはわかりません)を行う必要がありますが、そのリストのすべての位置のすべての組み合わせを生成する必要があります。

私が取得しようとしているシーケンスと出力は次のとおりです。

1 1
2 1
3 1
4 1
5 1

1 2
2 1
3 1
4 1
5 1

1 3
2 1
3 1
4 1
5 1

1 4
2 1
3 1
4 1
5 1

1 5
2 1
3 1
4 1
5 1

1 1
2 2
3 1
4 1
5 1

1 2
2 2
3 1
4 1
5 1

1 3
2 2
3 1
4 1
5 1

1 4
2 2
3 1
4 1
5 1

1 5
2 2
3 1
4 1
5 1

1 1
2 3
3 1
4 1
5 1

1 2
2 3
3 1
4 1
5 1

1 3
2 3
3 1
4 1
5 1

1 4
2 3
3 1
4 1
5 1

1 5
2 3
3 1
4 1
5 1

1 1
2 4
3 1
4 1
5 1

など...最後の状態は次のとおりです。

1 5
2 5
3 5
4 5
5 5

各改行は反復または再帰のステップであることに注意してください。アルゴリズムは汎用でなければなりません。私が書いたこのコードは役に立ちますが、私が望むものではありません。:(

List<List<int>> lstDays = new List<List<int>>
{
    new List<int>{1,2,3,4,5}, //day 18
    new List<int>{1,2,3,4,5}, //day 19
    new List<int>{1,2,3,4,5}, //day 22
    new List<int>{1,2,3,4,5}, //day 23
    new List<int>{1,2,3,4,5}, //day 24
};

for(int i=0;i<lstDays.Count;i++)
{
    for(int j=0;j<lstDays[i].Count;j++)
    {
        for(int k=0;k<lstDays.Count;k++)
        {
            Console.Write(k+1);

            //Console.Write(j+1);

            Console.Write('\n');
        }
        Console.Write('\n');
    }
}

あなたが私を助けてくれることを願っています!(:

4

2 に答える 2

1

以下の由緒ある Eric Lippert によるコメントに基づいて、OP の元の意図を編集します。

public void OutputSequence(int length){
    Recurse(length-1, Enumerable.Range(1, length).ToArray(), new int[length]);  
}

public void Recurse(int position, int[] arr, int[] state){  
    if (position == -1){
        PrintState(state);  
        return;
    }

    for (int i = 0; i < arr.Length; i++)
    {           
        state[position] = arr[i];
        Recurse(position-1, arr, state);
    }
}

public void PrintState(int[] state){
    for (int i = 0; i < state.Length; i++)
        Console.WriteLine ("{0} {1}",i+1, state[i]);        

        Console.WriteLine ();
}

OutputSequence(5);OPが最初に要求した出力が得られます。

古い回答

あなたが探しているものは、デカルト積と呼ばれます。LINQ はあなたの友達です:

var pairs = from i in Enumerable.Range(1, 5)
            from j in Enumerable.Range(1, 5)
            select new {i, j};

foreach(var p in pairs)
    Console.WriteLine ("{0} {1}", p.i, p.j);

編集: 楽しみのために、N-Ary デカルト積を実行する方法を次に示します。

public IEnumerable<IEnumerable<int>> NAryCartesianProduct(int upper, int times){
    if (times == 0)
        return Enumerable.Empty<IEnumerable<int>>();

    var nums = Enumerable.Range(1, upper);          
    IEnumerable<IEnumerable<int>> products = nums.Select(i => new[]{i});

    for (int i = 1; i < times; i++)
    {
        products = from p in products
                   from n in nums
                   select p.Concat(new [] {n});                                     
    }       

    return products;
}

そして今、あなたは以前に持っていたものを手に入れることができます:

var p = NAryCartesianProduct(5, 2);

foreach(var i in p)
    Console.WriteLine (i);

常に新しい配列を作成するよりも効率的な方法があると確信していますが、これを簡単にハックしました:)

これに関するはるかに有益な回答は次のとおりです。可能なすべての組み合わせを生成する

EDIT2:どうやら元のリンクは、そのSO投稿からの回答の起源です。今まで最後まで読んでいませんでした。

于 2013-08-25T15:00:28.367 に答える