zoukankan      html  css  js  c++  java
  • 数据结构与算法-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;    //再换回来
            }
        }
    }


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

  • 相关阅读:
    git线上操作
    IDEA快捷方式
    Java 四种线程池
    java 获取当前天之后或之前7天日期
    如何理解AWS 网络,如何创建一个多层安全网络架构
    申请 Let's Encrypt 通配符 HTTPS 证书
    GCE 部署 ELK 7.1可视化分析 nginx
    使用 bash 脚本把 AWS EC2 数据备份到 S3
    使用 bash 脚本把 GCE 的数据备份到 GCS
    nginx 配置 https 并强制跳转(lnmp一键安装包)
  • 原文地址:https://www.cnblogs.com/yangj-Blog/p/12960653.html
Copyright © 2011-2022 走看看