要搞清楚递归那么我们需要知道栈
那么我们来看一个经典的递归,来解析递归与栈的关系
代码如下
public class digui { public static void main(String[] args) { test(4); } public static void test(int n){ if(n>2) { test(n-1); } System.out.println("n="+n); } }
但是输出结果也许会神奇(一开始会以为是 4 3 2的顺序)
如果也和我一开始一样好奇那来看下图解析
我们发现递归test4由于调用自己,并且会自己开辟栈来运行下一个test3,同理test3开辟test2而2就满足条件停止,所以就到了sout那个打印
然后才是执行3 4等所以递归的原理就是与栈息息相关。
那我们再变通一下
public class digui { public static void main(String[] args) { test(4); } public static void test(int n){ if(n>2) { test(n-1); }else { System.out.println("n=" + n); } } }
那我们猜猜结果是什么?
对就是只有满足条件才else才sout所以只有test2会打印
递归思想:
假如针对abc的排列,可以分成 (1)以a开头,加上bc的排列 (2)以b开头,加上ac的排列 (3)以c开头,加上ab的排列
/** * 产生排列组合的递归写法 * @param t 数组 * @param k 起始排列值 * @param n 数组长度 */ void pai(int[] t, int k, int n){ if (k == n-1){//输出这个排列 for (int i = 0; i < n; i++) { System.out.print(t[i] + " "); } System.out.println(); }else { for (int i = k; i < n; i++) { int tmp = t[i]; t[i] = t[k]; t[k] = tmp;//一次挑选n个字母中的一个,和前位置替换 pai(t, k+1, n); //再对其余的n-1个字母一次挑选 tmp = t[i]; t[i] = t[k]; t[k] = tmp; //再换回来 } } }
本题用递归算法很巧妙,省去了用普通方法时保存数据状态的繁琐操作!