• 【算法】递归思想


    给定一个字符串(该字符串没有相同的字母),使用递归的方式打印出这个字符串所包含字母的所有组合方式

    package test1;
    
    public class num {
        public static void main(String[] args) {
            char[] c= {'a','b','c','d'};
            f(c,0);
        }
        
        /* c为待递归数组,先确定第一个字符,再确定第二个...b为所有已确定字符位的后一个字符位 */
        static void f(char c[],int b) {
            if(b==c.length-1) {
                /* 如果b已经是最后一个字符,所有字符已经确定 */
                System.out.println(c);//打印字符串,结束循环。
            }else {
                /* 如果b不是最后一个字符 */
                for(int i=b;i<c.length;i++) {
                    swap(c,b,i);//b和自己以及和之后的字符交换,使未确定每一个字符都有在b位确定的机会,【已经确定字符】【b】【剩下的字符】——》【已经确定字符】【i】【剩下的字符】
                    f(c,b+1);//确定下一位
                    swap(c,i,b);//因为i++后的i位还要和原来的b位交换,保证每一个字符都有在b位确定的机会,【已经确定字符】【i】【剩下的字符】——》【已经确定字符】【b】【剩下的字符】
                }
            }
        }
        
        /* 交换数组中两个字符位置 */
        static void swap(char c[],int a,int b) {
            char t=c[a];
            c[a]=c[b];
            c[b]=t;
        }
    }

    递归的思想:

    1.递归函数是上司,上司完成自己要做的事,然后交给 下属 干剩下的事

    2.递归函数既是长官,又是下属,干完自己分内的事,剩下交给属下干

    3.递归函数最后由最后的下属完成

    例如:

    1。f是最大上司,手上有为(0~L)位字符数组c,f的任务是从c里选一个字符确定在b(b=0)位,然后把字符串c剩下(1~L)的位交给下属确定,告诉下属b位和b位前的字符已经确定

    2。下属拿到字符串c后,再选b位以及b位之后的一个字符确定在b位(因为b位之前的字符已经被上司确定了),然后剩下((b+1)~L)的位交给下属确定,告诉下属b位和b位前的字符已经确定

    3。最后的下属要确定L位,由于之前的字符都已经确定,L位没得选,所以这名下属打印这个字符串,而且不继续给自己的下属任务。

  • 相关阅读:
    重构的信号
    枚举类返回Map键值对,绑定到下拉框
    js onclick函数中传字符串参数的问题
    python opencv3 矩形 圆形边框
    python opencv3 轮廓检测
    python opencv3 滤波器 卷积核
    python opencv3 窗口显示摄像头的帧
    python opencv3 显示一张图片
    python opencv3 获取摄像头视频
    python opencv3 视频文件的读写
  • 原文地址:https://www.cnblogs.com/LPworld/p/11520695.html
Copyright © 2020-2023  润新知