递归实现排列组合
递归
官方解释:一个过程或函数在其定义或说明中有直接或间接调用自身的一种方法,它通常把一个大型复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解,递归策略只需少量的程序就可描述出解题过程所需要的多次重复计算,大大地减少了程序的代码量。
通俗的讲就是一个特殊的循环,自己调用自己,比我们常用的for/while等循环的逻辑可能要复杂那么一点,下面我就用一个简单的demo帮大家理解一下
public class Permutate { // 保存生成的排列组合内容 public List<String> Permutation = new ArrayList<String>(); /** * 递归的方式计算排列组合 * @param list 传入list.size()个集合 * @param preStr 上一步递归中生成的排列组合 * @return */ public void permutation( List<List<String>> list,String preStr) { int size = list.size(); if(1==size){ for(int i=0; i<list.get(0).size(); i++) { Permutation.add(preStr + list.get(0).get(i)); } }else{ List<String> permu = new ArrayList<String>(list.get(0)); List<List<String>> now = new ArrayList<List<String>>(list); now.remove(0); for(int i=0; i<permu.size(); i++){ permutation(now, preStr +permu.get(i)); } } }
//准备递归用的参数 public static void main(String[] args) { List<String> list1 = new ArrayList<>(); list1.add("1"); list1.add("2"); list1.add("3"); List<String> list2 = new ArrayList<>(); list2.add("a"); list2.add("b"); list2.add("c"); List<String> list3 = new ArrayList<>(); list3.add("_A"); list3.add("_B"); list3.add("_C"); List<List<String>> list = new ArrayList<>(); list.add(list1); list.add(list2); list.add(list3); Permutate permutate = new Permutate(); permutate.permutation(list,""); String str = permutate.Permutation.toString(); System.out.println(str); } }
逻辑分析
结合上图,断点走一遍,或许你就会有自己的见解,递归是个比较灵活的算法,在很多特殊场景它发挥着其它循环无法比拟的作用