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


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

  • 相关阅读:
    A Famous City
    A Famous ICPC Team
    配置单元测试环境,找不到SenTestingKit
    linux解压.tar命令
    语音输入——科大讯飞
    查看dsym错误信息
    工程里关闭arc
    导入签名错误
    mac显示隐藏文件
    类uialertview弹出动画
  • 原文地址:https://www.cnblogs.com/yangj-Blog/p/12960653.html
Copyright © 2011-2022 走看看