经典递归问题:全排列问题

image

题目设计一个递归算法生成n个元素{r1,r2,…,rn}的全排列。


【算法讲解】:

设R={r1,r2,…,rn}是要进行排列的n个元素,Ri=R-{ri}。
集合X中元素的全排列记为perm(X)。
(ri)perm(X)表示在全排列perm(X)的每一个排列前加上前缀得到的排列。
R的全排列可归纳定义如下:
当n=1时,perm(R)=(r),其中r是集合R中唯一的元素;
当n>1时,perm(R)由(r1)perm(R1),(r2)perm(R2),…,(rn)perm(Rn)构成。

<font color="blue" face="方正宋黑简体">实现思想:将整组数中的所有的数分别与第一个数交换,这样就总是在处理后n-1个数的全排列。</font>


示例

当n=3,并且E={a,b,c},则:
perm(E)=a.perm({b,c}) + b.perm({a,c}) + c.perm({a,b})
perm({b,c})=b.perm(c) + c.perm(b)
a.perm({b,c})=a.b.perm(c) + a.c.perm(b)
​ =a.b.c + a.c.b=(abc, acb)

我的代码:

public class Main {
    public static void main(String[] args){
        char[] data="ABC".toCharArray();
        f(data,0);
    }
    private static void f(char[] data,int k) {
        if(k==data.length){//只剩下一个元素
            for(int i=0;i<data.length;i++){
                System.out.print(data[i]+" ");
            }
            System.out.println();
        }
        for(int i=k;i<data.length;i++){
            {char c=data[k];data[k]=data[i];data[i]=c;}//试探
            f(data,k+1);
            {char c=data[k];data[k]=data[i];data[i]=c;}//回溯
        }
    }
}

关于回溯:

3个电灯串联在一起,其中有个灯泡坏了,通过在灯泡正负极接上一根导线的方法来筛选出坏了的灯泡,每次检测下一灯泡时,必须先将连在上一灯泡的导线取下,保持在最初状态,这就是回溯。

image

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 选择题部分 1.(),只有在发生短路事故时或者在负荷电流较大时,变流器中才会有足够的二次电流作为继电保护跳闸之用。...
    skystarwuwei阅读 14,623评论 0 7
  • 专业考题类型管理运行工作负责人一般作业考题内容选项A选项B选项C选项D选项E选项F正确答案 变电单选GYSZ本规程...
    小白兔去钓鱼阅读 11,015评论 0 13
  • 一、补课 说来很是惭愧,20多年前在银行工作,就开始接触金融、经济、房地产,还曾负责过好几家房地产公司的信贷...
    都美阅读 263评论 1 1
  • 没想到距离春节最近的几个星期日还是在实验室度过,在等待试剂融化的短暂时间登录简书看到了自己去年写的两篇短文,像...
    弱弱黑驴阅读 159评论 0 2
  • 内容简介与目录 上一章:邢福星年少语狂,金宝山反悔改级 第21章:白淑贞表白意切,朱敏怡劝夫情真 北方的夏日昼长夜...
    扶青阅读 1,159评论 2 11

友情链接更多精彩内容