【问题标题】:c# recursion for matrix column combinationsc#矩阵列组合的递归
【发布时间】:2016-10-14 06:47:45
【问题描述】:

我有 K 个组的 MxN 矩阵。组是一组列。如何生成一组列与另一组列的组合?
例如 2x4 矩阵,组大小 - 2 列(1,2 - 第一,3,4 - 第二)
我得到组合
1 - 3
1 - 4
2 - 3
2 - 4
在这种情况下,我可以使用多个循环

for (int i = 0; i < 2; i++)
    for (int j = 2; j < 4; j++)
        Console.WriteLine("{0} - {1}", i, j);

3组2x6矩阵的情况如何?

for (int i = 0; i < 2; i++)
    for (int j = 2; j < 4 ; j++)
        for (int k = 4; k < 6; k++)
            Console.WriteLine("{0} - {1} - {2}", i, j, k);

其他情况呢?如何组织循环/递归?

【问题讨论】:

    标签: c# loops recursion matrix


    【解决方案1】:

    不确定此问题中行的边缘情况和角色,但对于您提供的简单情况,这将起作用:

        static void Main()
        {
            var columns = 6;
            var groupSize = 2;
    
            var groups = GetGroups(columns, groupSize).ToArray();
    
            var groupCurrentIndex = Enumerable.Range(0, groups.Length).ToDictionary(i => i, i => 0);
            var maxIndex = groupSize - 1;
    
            while (true)
            {
                var combination = groups.Select((g, i) => g[groupCurrentIndex[i]]);
                PrintCombination(combination);
    
                var incrementedGroupIndex = false;
                for (var i = groups.Length - 1; i > 0; i--)
                {
                    if (groupCurrentIndex[i] != maxIndex)
                    {
                        groupCurrentIndex[i]++;
                        incrementedGroupIndex = true;
                        break;
                    }
                    if (groupCurrentIndex[i] == maxIndex && groupCurrentIndex[i - 1] != maxIndex)
                    {
                        groupCurrentIndex[i-1]++;
                        incrementedGroupIndex = true;
    
                        for (var j = i; j < groups.Length; j++)
                        {
                            groupCurrentIndex[j] = 0;
                        }
                        break;
                    }
                }
                if (!incrementedGroupIndex)
                {
                    break;
                }
            }
    
            Console.ReadLine();
        }
    
        private static IEnumerable<int[]> GetGroups(int columns, int groupSize)
        {
            for (var startIndex = 0; startIndex < columns; startIndex = startIndex + groupSize)
            {
                yield return Enumerable.Range(startIndex, groupSize).ToArray();
            }
        }
    
        private static void PrintCombination(IEnumerable<int> combination)
        {
            Console.WriteLine(string.Join(" - ", combination));
        }
    

    【讨论】:

      猜你喜欢
      • 2018-03-14
      • 1970-01-01
      • 1970-01-01
      • 2015-05-25
      • 2017-05-03
      • 2019-11-13
      • 2018-03-29
      • 1970-01-01
      • 2019-03-25
      相关资源
      最近更新 更多