[英]Specific Combinations in C#, unable to grasp it
最近,我一直在研究組合,我嘗試了各種第三方解決方案,並試圖自己解決這個問題。 沒有成功,我可能會補充。
我需要生成一個長度為13的字符串,並說所有可能的組合。int 0-2,IE
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
您可能會開始練習,我知道如果我想要一個骯臟的解決方案,我可以將其循環包裝。 任何指導或指針,不勝感激。
我很樂意為您編寫代碼,但似乎您正在尋找對問題的直覺。 因此,也許這更像是“教人釣魚”的時刻。
所以讓我問你幾個問題:
讓我們將問題推廣到長度為N的字符串。N = 1的情況是什么樣的? 它的
0
1
2
N = 2的情況是什么樣的? 它的
00
01
02
10
11
12
20
21
22
我想知道您是否可以看到,在N = 1的情況下,我們如何以非常機械的方式輕松地推導(又稱為生成)N = 2的情況。 現在,如果您看到此特定情況的模式,您能否說出一般情況的模式? 即,如果您碰巧已經掌握了長度為N的字符串的答案,而我想請您提供長度為N + 1的字符串的答案,可以嗎? 如果是這樣,則您具有遞歸算法的定義。
附言:我認為我稱這些組合而不是排列。
我不禁將其視為僅在基於N的數字系統(在您的示例中為3基系統)中加數字。
我會寫一個方法(如果框架或庫中還沒有),則可以切換基礎。 IE:
String transformNumberFrom10BaseToXBase(int number, int base)
然后只需編寫一個for循環(對不起,類似偽c的代碼:)):
for (int i = 0; i < base ^ 13; i++) {
print transformNumberFrom10BaseToXBase(i, base)
}
好的,希望對您有所幫助或對您有所幫助:)
我已經快速編寫了返回排列列表的函數,因此,如果您沒有時間編寫自己的方法,則可以使用它。 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;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.