遞歸
官方解釋:一個過程或函數在其定義或說明中有直接或間接調用自身的一種方法,它通常把一個大型復雜的問題層層轉化為一個與原問題相似的規模較小的問題來求解,遞歸策略只需少量的程序就可描述出解題過程所需要的多次重復計算,大大地減少了程序的代碼量。
通俗的講就是一個特殊的循環,自己調用自己,比我們常用的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); } }
邏輯分析
結合上圖,斷點走一遍,或許你就會有自己的見解,遞歸是個比較靈活的算法,在很多特殊場景它發揮着其它循環無法比擬的作用