组合数据的输出(二)循环处理

     排列组合是高中是学到的 知识,理论上很清楚,但如何使用代码实现,却一直没有尝试过,近段时间由于项目需要,写一个组合的算法,想不到却花费了不少时间。

 在组合数据的输出一文中列举了几种输出的方法,但都是递归的方法,但又没有不用递归,只用循环的方法呢?于是自己就开始考虑了,都知道

要把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);

        }




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值