问题描述
我现在有一个类,有两个属性值:publicclassValueInfo{publicValueInfo(stringid,stringvalue){this.m_ID=id;this.m_Value=value;}privatestringm_ID=string.Empty;publicstringID{get{returnthis.m_ID;}set{this.m_ID=value;}}privatestringm_Value=string.Empty;publicstringValue{get{returnthis.m_Value;}set{this.m_Value=value;}}}
现在该类的集合如下:IList<ValueInfo>valueInfos=newList<ValueInfo>();valueInfos.Add(newValueInfo("A","01"));valueInfos.Add(newValueInfo("A","02"));valueInfos.Add(newValueInfo("B","03"));valueInfos.Add(newValueInfo("B","04"));valueInfos.Add(newValueInfo("B","05"));valueInfos.Add(newValueInfo("C","06"));valueInfos.Add(newValueInfo("C","07"));
我想得到如下的结果:A:01,B:03,C:06A:01,B:03,C:07A:01,B:04,C:06A:01,B:04,C:07A:01,B:05,C:06A:01,B:05,C:07A:02,B:03,C:06A:02,B:03,C:07A:02,B:04,C:06A:02,B:04,C:07A:02,B:05,C:06A:02,B:05,C:07就是把A、B、C三个ID的值组合在一起,但是要注意的一点是此处只是举例是ABC三个ID,实际ID的值是不固定的,有可能是A、B、C、D......求高手赐教这个递归算法应该怎么样实现?
解决方案
解决方案二:
一个思路是利用余数的性质:按ID分组,设第k组(k从0开始)项数为m[k],总共n组,最终返回的组合数为所有m[k]的积,记为prod,对于0到prod-1的每个整数i,对于0到n-1的每个整数j,取出第j组的第i%m[j]个项,组成一个组合。如有必要,还可以使用yield语法构造一个枚举数来实现延迟计算。
解决方案三:
引用1楼yangyi_2009的回复:
一个思路是利用余数的性质:按ID分组,设第k组(k从0开始)项数为m[k],总共n组,最终返回的组合数为所有m[k]的积,记为prod,对于0到prod-1的每个整数i,对于0到n-1的每个整数j,取出第j组的第i%m[j]个项,组成一个组合。如有必要,还可以使用yield语法构造一个枚举数来实现延迟计算。
上面漏写了,取完余数以后还有次除法i/=m[j]
解决方案四:
回答很多次了http://bbs.csdn.net/topics/360265119
解决方案五:
不需要递归的usingSystem;usingSystem.Collections.Generic;usingSystem.Linq;usingSystem.Text;namespace笛卡尔{classProgram{staticvoidMain(string[]args){List<ValueInfo>valueInfos=newList<ValueInfo>();valueInfos.Add(newValueInfo("A","01"));valueInfos.Add(newValueInfo("A","02"));valueInfos.Add(newValueInfo("B","03"));valueInfos.Add(newValueInfo("B","04"));valueInfos.Add(newValueInfo("B","05"));valueInfos.Add(newValueInfo("C","06"));valueInfos.Add(newValueInfo("C","07"));varid=valueInfos.Select(x=>x.ID).Distinct().ToList();varres=valueInfos.FindAll(x=>x.ID==id[0]).Select(x=>string.Format("{0}:{1}",x.ID,x.Value)).ToList();intlen=res.Count;intnext=1;inti=0;while(next<id.Count){len=res.Count;for(;i<len;i++){varlast=res[i];foreach(vartinvalueInfos.FindAll(x=>x.ID==id[next]).Select(x=>string.Format("{0}:{1}",x.ID,x.Value))){res.Add(last+","+t);}}next++;}res.RemoveRange(0,len);Console.WriteLine(string.Join("n",res));Console.ReadKey();}}publicclassValueInfo{publicValueInfo(stringid,stringvalue){this.m_ID=id;this.m_Value=value;}privatestringm_ID=string.Empty;publicstringID{get{returnthis.m_ID;}set{this.m_ID=value;}}privatestringm_Value=string.Empty;publicstringValue{get{returnthis.m_Value;}set{this.m_Value=value;}}}}
解决方案六:
你这个是笛卡尔乘积吧?用3重循环?
解决方案七:
笛卡尔乘积,果然回答过很多次了……
解决方案八:
多年前的回答竟然在这里再次看到了...
解决方案九:
既然每年都有一大批新人加入此道,重复的问题重复出现,又有什么可奇怪的如果说你们已经回答过了,那么请给出链接如果连你们自己都找不到,那就别怪人家是重复提问了
解决方案十:
赶紧贴一个,以示我回答过