我有一个总是偶数项目的列表。
我需要一个算法来查找所有两个成员组合。
例如,如果项目计数为4,则输出为;
产品:
{1,2,3,4}
ResulSet:
{12},{34}
{13},{24}
{14},{23}
订单没有区别,{12}涵盖{21}。
对于项目计数6,输出将是;
产品:
{1,2,3,4,5,6}
ResulSet:
12 34 56
12 35 46
12 36 45
13 24 56
13 25 46
13 26 45
14 23 56
14 25 36
14 26 35
15 23 46
15 24 36
15 26 34
16 23 45
16 24 35
16 25 34
你可以告诉我一个方法吗?谢谢。
编辑:
问题真的很难阅读,如果你花1分钟阅读问题,你会发现它并不像大多数人想的那样重复(可能是半文盲)
{1,2,3,4,5,6}的组合是
123456正如你在顶部看到的,这不是我想要的。如果你想帮忙或者下车,请阅读问题。
度过愉快的一天。
答案 0 :(得分:0)
由于组合中总是有两个成员,因此应该使用一个简单的嵌套for循环:
for (int i = 0; i < data.Length - 1; i++)
for (int j = i + 1; j < data.Length; j++
Console.WriteLine({0}{1}, i, j);
我们遍历列表中的每个项目,直到最后一个项目(因为我们不能有1个数字组合)。在每个迭代中,我们从外部迭代变量加1(没有重复元素)迭代到列表末尾。
这将生成所有独特的组合。要做两个或三个以上的成员输出,你需要考虑递归。我将格式化输出以匹配您的问题作为练习给读者:)。
对于6个元素组合,我们将不得不深入研究递归的狂野世界。递归真的会弄乱你的头,所以请问你是否理解不了解。递归的一般原则是:“用第一个元素做一些事情,自称并通过其余部分”。在这种情况下,代码看起来像:
public List<List<int>> GetAllCombos (int[] values)
{
//Kick it off with the 0 index
return GetCombos(values, 0);
}
private List<List<int>> GetCombos(int[] values, int myIndex)
{
//A holder for combinations from this index onward
List<List<int>> combos = new List<List<int>>();
for (int i = myIndex; i < values.Length; i++)
{
if (myIndex + 1 < values.Length)
{
foreach (List<int> combo in GetCombos(values, myIndex + 1))
{
combo.Add(values[myIndex][i]);
combos.Add(combo);
}
}
else
{
List<int> newCombination = new List<int>() { values[myIndex][i] };
combos.Add(newCombination);
}
}
return combos;
}
再次,请确保您询问您是否理解某事。递归可能是一个非常难以理解的概念!
答案 1 :(得分:0)
所有这些都会告诉你如何做到这一点。
搜索SO时,您会立即找到这个问题,Algorithm to return all combinations of k elements from n,拥有更多资源(更不用说实际解决方案)了。