• 数据结构与算法-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;    //再换回来
            }
        }
    }


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

  • 相关阅读:
    准备 FRM 考试——方法、工具与教训
    930. 和相同的二元子数组 前缀和
    1906. 查询差绝对值的最小值 前缀和
    剑指 Offer 37. 序列化二叉树 二叉树 字符串
    815. 公交路线 BFS
    518. 零钱兑换 II dp 完全背包
    1049. 最后一块石头的重量 II dp
    5779. 装包裹的最小浪费空间 二分
    5778. 使二进制字符串字符交替的最少反转次数 字符串 滑动窗口
    474. 一和零 dp
  • 原文地址:https://www.cnblogs.com/yangj-Blog/p/12960653.html
Copyright © 2020-2023  润新知