我有这个char数组:private char[] posibilities = { 'a', 'b', 'c' };
我想要所有可能的组合,然后我做了三个嵌套:
for (int cont = 0; cont < posibilities.Length; cont++)
{
for (int i = 0; i < posibilities.Length; i++)
{
for (int j = 0; j < posibilities.Length; j++)
{
listBox1.Items.Add(posibilities[cont].ToString() + posibilities[i].ToString() + posibilities[j].ToString());
}
}
}
我的问题是:如果我想在我的数组中添加更多字符而不向嵌套中添加更多字符,我该怎么办?想象一下,如果我在阵列上有20个字符,我就不能做20个......或者那是唯一的方法吗?
(顺便说一句,我从3个月前开始尝试解决这个问题,但我还是不能)
答案 0 :(得分:1)
尝试这种递归方法:
void RecursiveApproach(char[] possibilities, string cur)
{
if (cur.Length == c.Length)
{
listBox1.Items.Add(cur);
return;
}
for (int i = 0; i < possibilities.Length; i++)
{
RecursiveApproach(possibilities, cur + possibilities[i]);
}
}
// Usage
RecursiveApproach(possibilities, "");
如果无法使全局可见,则可以将listBox1作为第三个参数传递给此函数。
但要注意大数字,这个列表会非常快速地增长))
答案 1 :(得分:0)
public static IEnumerable<IEnumerable<T>> PermutationsWithRepitition<T>(IList<T> source)
{
return PermutationsWithRepitition(source, source.Count);
}
//private recursive method that does all of the work.
private static IEnumerable<IEnumerable<T>> PermutationsWithRepitition<T>(IList<T> source, int resultSize)
{
if (resultSize == 1)
return source.Select(item => new[] { item });
else
{
return PermutationsWithRepitition(source, resultSize - 1)
.SelectMany(permutation => source.Select(item => new[]{item}.Concat(permutation)));
}
}
示例用法:
char[] posibilities = new[] { 'a', 'b', 'c' };
foreach (var permutation in PermutationsWithRepitition(posibilities))
{
Console.WriteLine(new string(permutation.ToArray()));
}