使用一个函数让它工作时遇到了一些麻烦,而不是必须使用很多函数。
如果我想用2 ^ 3的重复进行排列。 permutations with repeats
得到:
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();
}
}
}
}
}
但我确信使用递归有更好的方法我只是不确定如何做到这一点。我感谢任何帮助。谢谢。
答案 0 :(得分: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进行计数。
答案 1 :(得分: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);
答案 2 :(得分: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;
}
}