排列组合是高中是学到的 知识,理论上很清楚,但如何使用代码实现,却一直没有尝试过,近段时间由于项目需要,写一个组合的算法,想不到却花费了不少时间。
在组合数据的输出一文中列举了几种输出的方法,但都是递归的方法,但又没有不用递归,只用循环的方法呢?于是自己就开始考虑了,都知道
要把4个元素的所有组合输出,必须递归4次,对应的是4层的循环,要把5个元素的所有组合输出,必须递归5次,对应的是5层的循环,一时间自己竟没有找到如何把递归改为循环的方法。于是自己就一最简单的方法,思考一个元素的组合,两个元素的组合,三个元素的组合。
想不到竟然也有了启发。
例如:1,2,3的组合
考察:1的组合 ,只有1
考察:1,2的组合,1;2;1,2;
考察:1,2,3的组合,1;2;1,2;1,3;2,3;1,2,3
改变一下:
考察:1的组合 ,{1}
考察:1,2的组合,{1};{1,2};{2};
考察:1,2,3的组合,{1};{1,2};{2};{1,3};{2,3};{1,2,3}
在改变一下:
考察:1的组合 ,{1}
考察:1,2的组合,{1};2{1};{2};
考察:1,2,3的组合,{1};2{1};{2};3{{1};2{1};{2};} ;{3};
使用数学定定义,就有些类似于a(1)=1,a(n)=a(n-1)+n(a(n-1))+n
发现,每增加一个元素,实际上是在已有集合的每个集合中增加这个新加的元素。并加上这个新元素的集合
于是便有了只使用循环的组合算法
public static void CreatSumData4(List<string> columnNameList)
{
List<string> list = new List<string>();
for (int i = columnNameList.Count-1;i>=0 ; i--)
{
string name=columnNameList[i];
int count = list.Count;
for (int j = 0; j < count; j++)
{
string item = list[j];
list.Add(name+","+item);
}
list.Add(name);
}
StringBuilder strs = new StringBuilder();
for (int j = 0; j < list.Count; j++)
{
string item = list[j];
strs.AppendLine(item);
}
WrieData(strs.ToString());
}
private static void WrieData(string text)
{
string file = "ZuheTestout.js";
StreamWriter sr = new StreamWriter(file);
sr.WriteLine(text);
sr.Close();
}
public static void Test()
{
List<string> columns = new List<string>();
columns.Add("c0");
columns.Add("c1");
columns.Add("c2");
columns.Add("c3");
columns.Add("c4");
// CreatSumData1(columns);
// string text = CreateAllGroupingData(columns);
// WrieData(text);
CreatSumData4(columns);
}