所谓递归,就是方法调用自身。对于递归模式来说,要有一个出口来让递归结束,避免出现死循环。
实例全排列:
从n中拿出m个元素进行排列,当n==m时为全排列。
利用递归就是:把n个元素轮流放入第一个位置,剩余位置全排列(等同于(n-1)全排列+剩余的元素)
设置出口:当n-1等于1时说明递归到最后一个元素,回调。
1 package com.zhanghaobo.arrangement; 2 3 /** 4 * @author Administrator 5 *排列方法:轮流把数组中元素放入第一个位置,剩余元素全排列(递归),直至剩余元素为1,排列完成。 6 *begin++当begin==end时说明递归到出口,返回 7 */ 8 /** 9 * @author Administrator 10 * 11 */ 12 public class ArrangementTest { 13 14 public static void main(String[] args) { 15 int[] nums=new int[]{1,2}; 16 arrangment(nums, 0, nums.length-1); 17 18 } 19 /** 20 * @param a 21 * @param begin 22 * @param end 23 * 将数组a中的从begin-end位置的元素全排列 24 */ 25 public static void arrangment(int[] a,int begin,int end){ 26 27 if(end==begin){ 28 for(int b:a){ 29 System.out.print(b); 30 } 31 System.out.println(""); 32 return; 33 } 34 else{ 35 //begin从0开始进行全排列直至begin==end;循环完成一轮后要恢复到原来数组的状态以便下个轮换 36 37 for(int i=0;i<=end;i++){ 38 swap(a,begin, i); 39 arrangment(a,begin+1,end); 40 swap(a,begin,i); 41 } 42 } 43 } 44 45 /** 46 * 其他位置上的元素轮流和begin位置互换,以便其他元素全排列 47 */ 48 public static void swap(int[] a,int begin,int other){ 49 int temp=a[begin]; 50 a[begin]=a[other]; 51 a[other]=temp; 52 } 53 }