【问题标题】:Specific Combinations in C#, unable to grasp itC#中的具体组合,无法掌握
【发布时间】:2011-10-01 23:04:00
【问题描述】:

我最近一直在研究组合,我尝试了各种第 3 方解决方案,并试图自己解决这个问题。如果没有成功,我可能会添加。

我需要生成一个长度为 13 的字符串,其中包含say.. int 0-2, I.E 的所有可能组合

0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 1
0 0 0 0 0 0 0 0 0 0 0 0 2
0 0 0 0 0 0 0 0 0 0 0 1 0
... 
2 2 2 2 2 2 2 2 2 2 2 2 2

您可能会得到练习,我知道如果我想要一个肮脏的解决方案,我可以将其包装在循环中。任何指导或指针表示赞赏。

【问题讨论】:

  • 那些不是permutations
  • 对不起,好像是我的误会:)

标签: c# combinations


【解决方案1】:

我很乐意为您编写代码,但您似乎正在寻找对问题的直觉。所以也许这更像是一个“教人钓鱼”的时刻。

所以让我问你几个问题:

让我们将问题推广到长度为 N 的字符串。N=1 的情况是什么样的?这是

0
1
2

N=2 的情况是什么样的?这是

00
01
02
10
11
12
20
21
22

我想知道您是否可以看到,在给定 N=1 的情况下,我们可以很容易地以非常机械的方式推导出(也称为生成)N=2 的情况。现在,如果您看到这种特定情况的模式,您能说出一般情况的模式吗?即,如果您碰巧已经掌握了长度为 N 的字符串的答案,并且我要求您向我提供长度为 N + 1 的字符串的答案,您可以这样做吗?如果是这样,您就有了递归算法的定义。

PS 我想我会称这些组合而不是排列。

【讨论】:

  • 是的,这确实澄清了一些事情,你可能已经教过另一个新手钓鱼了 :) 我会尝试一些事情。
【解决方案2】:

我不禁认为这只是在基于 N 的数字系统(在您的示例中为 3 基系统)中添加数字。

我会编写一种方法(如果框架或库中还没有),可以让您切换基数。即:

String transformNumberFrom10BaseToXBase(int number, int base)

然后只写一个 for 循环(抱歉,伪 c 代码 :)):

for (int i = 0; i < base ^ 13; i++) {
    print transformNumberFrom10BaseToXBase(i, base)
}

好的,希望对您有所帮助或给您一个解决方法的想法:)

【讨论】:

  • 这似乎也是一个有效的解决方案,甚至更清洁。我会调查的。谢谢你的洞察力:)
【解决方案3】:

我已经编写了返回排列列表的快速函数,所以如果你没有时间编写自己的方法,你可以使用它。 length 是排列长度,max 是最大数(在你的情况下,它是 2)

    static List<int[]> getPermutationList(int length, int max)
    {
        List<int[]> perm_list = new List<int[]>();
        int[] perm = new int[length];
        for (int i = 0; i < length; ++i)
            perm[i] = 0;
        while(true)
        {
            for (int i = length - 1; ; --i)
            {
                if (i == -1)
                    return perm_list;
                if (perm[i] < max)
                {
                    perm[i]++;
                    for (int j = i + 1; j < length; ++j)
                        perm[j] = 0;
                    break;
                }

            }
            int[] perm_copy = new int[length];


            for (int i = 0; i < length; ++i)
            {
                perm_copy[i] = perm[i];
            }
            perm_list.Add(perm_copy);
        }
        return perm_list;
    }

【讨论】:

    猜你喜欢
    • 2011-10-07
    • 2010-09-10
    • 1970-01-01
    • 2018-04-25
    • 1970-01-01
    • 2011-05-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多