数据结构与算法-java-递归

要搞清楚递归那么我们需要知道栈

那么我们来看一个经典的递归,来解析递归与栈的关系

代码如下

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;    //再换回来
        }
    }
}


本题用递归算法很巧妙,省去了用普通方法时保存数据状态的繁琐操作!

原文地址:https://www.cnblogs.com/yangj-Blog/p/12960653.html