递归模式学习(recursion)

所谓递归,就是方法调用自身。对于递归模式来说,要有一个出口来让递归结束,避免出现死循环。

实例全排列:

从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 }

 

posted on 2016-04-08 15:08  oldcowstruggle  阅读(736)  评论(0编辑  收藏  举报