笛卡尔积很多时候都会用到,以下是java的实现:
import java.util.ArrayList; import java.util.List;
public class Descartes { public static void run(List<List<String>> dimvalue,List<String> result,int layer,String curstring) { //如果不是最后一个子集合时 if(layer<dimvalue.size()-1) { //如果当前子集合元素个数为空,则递归调用,进入到下一个子集合的计算。 if(dimvalue.get(layer).size()==0) { run(dimvalue,result,layer+1,curstring); } else { //如果当前子集合元素不为空,则循环当前子集合元素,累加到临时变量 后面。并且继续递归调用,直到达到父集合的最后一个子集合。 for(int i=0;i<dimvalue.get(layer).size();i++) { StringBuilder s1=new StringBuilder(); s1.append(curstring); s1.append(dimvalue.get(layer).get(i)); run(dimvalue,result,layer+1,s1.toString()); } } } //递归调用到最后一个子集合时 else { //如果当前子集合元素为空,则到此为止,将临时变量加入到结果集中。 if(dimvalue.get(layer).size()==0) { result.add(curstring); } //如果当前子集合元素不为空,则循环当前子集合所有元素,累加到临时变量后面 ,然后将临时变量加入到结果集中。 else { for(int i=0;i<dimvalue.get(layer).size();i++) { result.add(curstring+dimvalue.get(layer).get(i)); } } } } public static void main(String[] args) { List<List<String>> dimvalue=new ArrayList<List<String>>(); List<String> v1=new ArrayList<String>(); v1.add("1"); v1.add("2"); List<String> v2=new ArrayList<String>(); v2.add("A"); v2.add("B"); List<String> v3=new ArrayList<String>(); v3.add("1"); v3.add("2"); v3.add("3");
dimvalue.add(v1); dimvalue.add(v2); dimvalue.add(v3); List<String> result=new ArrayList<String>(); Descartes.run(dimvalue,result,0,"");
int i=0; for(String s:result) { System.out.println(i++ + ":"+s); } } }
输出结果为:
备注是我自己写,如有不当,欢迎指正。其中使用到递归调用的方法。参考来源:http://blog.chinaunix.net/uid-21125022-id-4392818.html